home *** CD-ROM | disk | FTP | other *** search
/ Aminet 45 / Aminet 45 (2001)(GTI - Schatztruhe)[!][Oct 2001].iso / Aminet / dev / e / 2b_CrtvE_src.lha / parse.s < prev    next >
Text File  |  2001-01-29  |  57KB  |  2,763 lines

  1. ;;PARSE
  2.  
  3. ; ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ;
  4. ;   The Parsing Routines                    ;
  5. ; ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ;
  6.  
  7. LEXMESSY:   DC.B    'lexical analysing ...',10
  8. ENDLEXMESSY:    EVEN
  9.  
  10. TOKENIZE:
  11.  
  12.     MOVE.W  #-1,EXPORTFLAG
  13.     BTST    #6,CODEPREFS+2      ; SEE IF EXPORT ALL
  14.     BNE.S   .EA
  15.     CLR.W   EXPORTFLAG
  16. .EA:    MOVE.W  #2,CURSPOT
  17.     BTST    #7,CODEPREFS+2
  18.     BNE.S   .11
  19.     MOVE.L  #LEXMESSY,D2
  20.     MOVEQ   #ENDLEXMESSY-LEXMESSY,D3
  21.     BSR WRITECON
  22. .11:    CLR.W   LINENUM
  23.     CLR.L   CONSTD
  24.     MOVE.W  #1,ERRWHERE
  25. .2: MOVE.L  CURECODE,A0
  26.     CMP.L   ENDECODE,A0
  27.     BPL.S   .1
  28.     BSR PARSELINE
  29.     BRA.S   .2
  30. .1: TST.W   PREPSTACKSIZE
  31.     BNE iERROR65
  32.     MOVE.W  LINENUM,MAXLINENUM
  33.     MOVE.L  CURINTERIM,A1
  34.     MOVE.L  A1,TOKENEND
  35.     MOVE.L  #-1,(A1)+
  36.     MOVE.W  #-1,LINENUM
  37.     MOVE.W  #0,ERRWHERE
  38.     CLR.W   LINENUM2
  39.     RTS
  40.  
  41. PARSELINE:
  42.     BSR REALLOC1
  43.     BSR WRITELINENUM
  44.     
  45.     MOVE.W  #-1,CURINS
  46.     MOVE.L  CURECODE,A0
  47.     MOVE.L  CURINTERIM,A1
  48.     MOVE.W  #21,(A1)+
  49.     MOVE.W  LINENUM2,(A1)+
  50.     LEA 2(A1),A2
  51.     MOVE.L  A2,STARTINTERIM
  52.     MOVE.L  WORK,A2
  53.     MOVEQ   #0,D0
  54.     MOVE.W  D0,PARSEBRACKET
  55.     MOVE.W  D0,XF
  56.     MOVEQ   #0,D4
  57.     MOVE.W  #-1,CURINS
  58. PARSELOOP:
  59.     MOVEQ   #0,D7
  60.     MOVE.B  (A0)+,D7        ; CURRENT CHAR
  61.     MOVE.B  (A0),D6         ; NEXT CHAR; WE CAN LOOK AHEAD ! YEAH !
  62.  
  63.     MOVE.W  D7,D5
  64.     LSL.W   #2,D5
  65.     MOVE.L  JUMPTAB(PC,D5.W),A4
  66.     JMP (A4)
  67.  
  68. JUMPTAB:
  69.     DC.L    PREPMACRODONE,E,E,E,E,E,E,E         ; 0
  70.     DC.L    E,PARSELOOP,PARSEENDLINE,E,PARSELOOP,E,E,E  ; 8
  71.     DC.L    E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E         ; 16
  72.     DC.L    PARSELOOP,PARSEFLT,PARSELONGSTR,ASM_PARSEIMM    ; 32
  73.     DC.L    PARSEHEXNUM,PARSEBINNUM,PARSEAMP,PARSESTRING       ; 36
  74.     DC.L    PARSEOPEN,PARSECLOSE,PARSEPROD,PARSEPLUS    ; 40
  75.     DC.L    PARSECOMMA,PARSEMINUS,PARSEPERIOD,PARSEDIV  ; 44
  76.     DC.L    VAL,VAL,VAL,VAL,VAL,VAL,VAL,VAL         ; 48
  77.     DC.L    VAL,VAL,PARSEBECOMES,PARSEENDLINE       ; 56
  78.     DC.L    PARSESMALLER,PARSEEQ,PARSEBIGGER,QMARK  ; 60
  79.     DC.L    E,ID,ID,ID,ID,ID,ID,ID              ; 64
  80.     DC.L    ID,ID,ID,ID,ID,ID,ID,ID             ; 72
  81.     DC.L    ID,ID,ID,ID,ID,ID,ID,ID             ; 80
  82.     DC.L    ID,ID,ID,PARSESQ1,E,PARSESQ2,PARSEPTR,ID    ; 88
  83.     DC.L    PARSEQUOTE,ID,ID,ID,ID,ID,ID,ID         ; 96
  84.     DC.L    ID,ID,ID,ID,ID,ID,ID,ID             ; 104
  85.     DC.L    ID,ID,ID,ID,ID,ID,ID,ID             ; 112
  86.     DC.L    ID,ID,ID,PARSECURL1,PARSECONS,PARSECURL2,E,E    ; 120
  87.     DC.L    E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E         ; 128
  88.     DC.L    E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E         ; 144
  89.     DC.L    E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E         ; 160
  90.     DC.L    E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E         ; 176
  91.     DC.L    E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E         ; 192
  92.     DC.L    E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E         ; 208
  93.     DC.L    E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E         ; 224
  94.     DC.L    E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E         ; 240
  95.  
  96. E: BRA iERROR3
  97.  
  98. ;; ","
  99. PARSECOMMA:           ; ,
  100.     MOVEQ   #COM,D4
  101.     MOVE.W  D4,(A1)+
  102.     BRA PARSELOOP
  103. ;*-*
  104. ;; + ++
  105. PARSEPLUS:            ; + ++
  106.     CMP.B   #'+',D6
  107.     BEQ.S   .1
  108.     MOVEQ   #7,D4
  109.     MOVE.W  D4,(A1)+
  110.     BRA PARSELOOP
  111. .1: ADDQ.L  #1,A0
  112.     MOVEQ   #33,D4
  113.     MOVE.W  D4,(A1)+
  114.     BRA PARSELOOP
  115. ;*-*
  116. ;; - --
  117. PARSEMINUS:           ; - --
  118.     CMP.B   #'-',D6
  119.     BEQ.S   .1
  120.     CMP.B   #'>',D6
  121.     BEQ.S   .2
  122.     MOVEQ   #8,D4
  123.     MOVE.W  D4,(A1)+
  124.     BRA PARSELOOP
  125. .1: ADDQ.L  #1,A0
  126.     MOVEQ   #34,D4
  127.     MOVE.W  D4,(A1)+
  128.     BRA PARSELOOP
  129. .2: MOVEQ   #10,D0
  130. .XL:CMP.B   (A0)+,D0
  131.     BNE.S   .XL
  132.     SUBQ.L  #1,A0
  133.     BRA PARSELOOP
  134. ;*-*
  135. ;; "*"
  136. PARSEPROD:            ; *
  137.     CMP.B   #'/',D6
  138.     BEQ iERROR27
  139.     MOVEQ   #9,D4
  140.     MOVE.W  D4,(A1)+
  141.     BRA PARSELOOP
  142. ;*-*
  143. ;; / //
  144. PARSEDIV:             ; *
  145.     CMP.B   #'*',D6
  146.     BEQ.S   COMMENT
  147.     CMP.B   #"/",D6
  148.     BEQ     .CMNT
  149.     MOVEQ   #10,D4
  150.     MOVE.W  D4,(A1)+
  151.     BRA PARSELOOP
  152. .CMNT:
  153.     CMP.B   #10,(A0)+
  154.     BNE     .CMNT
  155.     SUBQ.L  #1,A0
  156.     BRA PARSELOOP
  157. ;*-*
  158. ;; /* */
  159. COMMENT:              ; /* */
  160.     MOVE.L  A0,A3           ; BACKUP
  161.     MOVE.L  LINENUM,A4      ; BACKUPTOO
  162.     MOVEQ   #1,D0           ; COUNTING COMMENTS
  163.     MOVEQ   #'/',D1
  164.     MOVEQ   #'*',D2
  165.     MOVE.L  ENDECODE,D3
  166.     CMP.L   D3,A0
  167.     BMI.S   .NM
  168.     MOVEQ   #0,D3           ; IN A MACRO
  169. .NM:    MOVEQ   #10,D5
  170.     ADDQ.L  #1,A0
  171. .1: TST.L   D0
  172.     BEQ.S   .3
  173.     TST.L   D3
  174.     BEQ.S   .MA
  175.     CMP.L   D3,A0
  176.     BPL.S   .ER
  177. .XB:MOVE.B  (A0)+,D7
  178.     MOVE.B  (A0),D6
  179.     CMP.B   D7,D5
  180.     BEQ.S   .4
  181. .5: CMP.B   D1,D7           ; IS THIS LIKE "/*" ?
  182.     BNE.S   .2
  183.     CMP.B   D2,D6
  184.     BNE.S   .2
  185.     ADDQ.L  #1,D0
  186.     ADDQ.L  #1,A0
  187.     BRA.S   .1
  188. .2: CMP.B   D2,D7           ; OR LIKE "*/" ?
  189.     BNE.S   .1
  190.     CMP.B   D1,D6
  191.     BNE.S   .1
  192.     SUBQ.L  #1,D0
  193.     ADDQ.L  #1,A0
  194.     BRA.S   .1
  195. .3: BRA PARSELOOP
  196. .4: ADDQ.W  #1,LINENUM
  197.     BRA.S   .5
  198. .ER:    MOVE.L  A3,A0           ; FOR ERROR REPORT
  199.     SUBQ.L  #1,A0
  200.     MOVE.L  A4,LINENUM
  201.     BRA iERROR27
  202. .MA:    TST.B   (A0)
  203.     BEQ.S   .ER
  204.     BRA.S   .XB
  205. ;*-*
  206. ;; "`"
  207. PARSEQUOTE:           ; `
  208.     MOVEQ   #36,D4
  209.     MOVE.W  D4,(A1)+
  210.     BRA PARSELOOP
  211. ;*-*
  212. ;; "="
  213. PARSEEQ:              ; =
  214.     CMP.B   #">",D6
  215.     BEQ     .1
  216.     CMP.B   #"<",D6
  217.     BEQ     .2
  218.     MOVEQ   #11,D4
  219.     MOVE.W  D4,(A1)+
  220.     BRA PARSELOOP
  221. .1: ADDQ.L  #1,a0
  222.     MOVEQ   #14,D4
  223.     MOVE.W  D4,(A1)+
  224.     BRA PARSELOOP
  225. .2: ADDQ.L  #1,A0
  226.     MOVEQ   #15,D4
  227.     MOVE.W  D4,(A1)+
  228.     BRA PARSELOOP
  229. ;*-*
  230. ;; "^"
  231. PARSEPTR:             ; ^
  232.     MOVEQ   #32,D4
  233.     MOVE.W  D4,(A1)+
  234.     BRA PARSELOOP
  235. ;*-*
  236. ;; "&"
  237. PARSEAMP:
  238.     MOVE.W  #IOFF+29,D4
  239.     MOVE.W  D4,(A1)+
  240.     BRA PARSELOOP
  241. ;*-*
  242. ;; "!"
  243. PARSEFLT:             ; !
  244.     BTST    #1,CODEPREFS
  245.     BNE     .1
  246.     BSET    #3,CODEPREFS+1
  247. .1: MOVEQ   #37,D4
  248.     MOVE.W  D4,(A1)+
  249.     BRA PARSELOOP
  250. ;*-*
  251. ;; "| ||"
  252. PARSECONS:            ; |
  253.     CMP.B   #"|",D6
  254.     BEQ     .OR
  255.     MOVEQ   #46,D4
  256.     MOVE.W  D4,(A1)+
  257.     BRA PARSELOOP
  258. .OR:ADDQ.L  #1,A0
  259.     MOVE.W  #IOFF+30,D4
  260.     MOVE.W  D4,(A1)+
  261.     BRA PARSELOOP
  262. ;*-*
  263. ;; "{"
  264. PARSECURL1:           ; {
  265.     MOVEQ   #23,D4
  266.     MOVE.W  D4,(A1)+
  267.     BRA PARSELOOP
  268. ;*-*
  269. ;; "}"
  270. PARSECURL2:           ; }
  271.     MOVEQ   #0,D4
  272.     MOVE.W  #24,(A1)+
  273.     BRA PARSELOOP
  274. ;*-*
  275. MAXBRACK    = 50
  276. CURBRACK:   DC.L    0
  277. ;; "["
  278. PARSESQ1:             ; [
  279.     MOVEQ   #29,D4
  280.     MOVE.W  D4,(A1)+
  281.     MOVE.L  CURBRACK(PC),A3     ; 29:INT, otherbrackoff:LONG
  282.     CMPA.L  #BRACKETSBUF,A3
  283.     BNE.S   .1
  284.     MOVE.L  A0,SQBRAKPOS
  285.     MOVE.L  LINENUM,SQBRAKLINE
  286. .1: MOVE.L  A1,(A3)+
  287.     MOVE.L  A3,CURBRACK
  288.     CLR.L   (A1)+
  289.  
  290.     BRA PARSELOOP
  291. ;*-*
  292. ;; "]"
  293. PARSESQ2:             ; ]
  294.     MOVEQ   #30,D4
  295.     MOVE.W  D4,(A1)+
  296.     MOVE.L  CURBRACK(PC),A3
  297.     CMPA.L  #BRACKETSBUF,A3
  298.     BEQ iERROR52
  299.     MOVE.L  -(A3),A4
  300.     MOVE.L  A3,CURBRACK
  301.     MOVE.L  A1,D0
  302.     SUB.L   A4,D0
  303.     MOVE.L  D0,(A4)         ; OFFSET = {otherbrackoff} .. ob+2
  304.     BRA PARSELOOP
  305.  
  306. ;*-*
  307. ;; "."
  308. PARSEPERIOD:          ; . .l .b .w
  309.     MOVEQ   #26,D4
  310.     CMP.B   #'W',D6
  311.     BNE.S   .1
  312.     MOVE.W  D4,(A1)+
  313.     BRA .3
  314. .1: CMP.B   #'B',D6
  315.     BNE.S   .2
  316.     MOVE.W  #28,(A1)+
  317.     BRA .3
  318. .2: CMP.B   #'L',D6
  319.     BNE.S   .4
  320.     MOVE.W  #27,(A1)+
  321. .3: ADDQ.L  #1,A0
  322.     BRA PARSELOOP
  323. .4: CMP.B   #58,D6
  324.     BMI.S   .5
  325. .6: MOVEQ   #35,D4
  326.     MOVE.W  D4,(A1)+
  327.     BRA PARSELOOP
  328. .5: CMP.B   #48,D6
  329.     BMI.S   .6
  330.     BRA PARSEVALUE
  331. ;*-*
  332. ;; > >= >>
  333. PARSEBIGGER:          ; > >=
  334.     CMP.B   #'=',D6
  335.     BEQ.S   .1
  336.     CMP.B   #">",D6
  337.     BEQ     .2
  338.     MOVEQ   #12,D4
  339.     MOVE.W  D4,(A1)+
  340.     BRA PARSELOOP
  341. .1: MOVEQ   #14,D4
  342.     MOVE.W  D4,(A1)+
  343.     ADDQ.L  #1,A0
  344.     BRA PARSELOOP
  345. .2: ADDQ.L  #1,A0
  346.     MOVEQ   #50,D4
  347.     MOVE.W  D4,(A1)+
  348.     BRA     PARSELOOP
  349. ;*-*
  350. ;; < <= <> <=> <<
  351. PARSESMALLER:
  352.     CMP.B   #'=',D6
  353.     BEQ.S   .1
  354.     CMP.B   #'>',D6
  355.     BEQ.S   .2
  356.     CMP.B   #"<",D6
  357.     BEQ     .4
  358.     MOVEQ   #13,D4          ; <
  359.     MOVE.W  D4,(A1)+
  360.     BRA PARSELOOP
  361. .1: ADDQ.L  #1,A0
  362.     CMP.B   #'>',(A0)
  363.     BEQ.S   .3
  364.     MOVEQ   #15,D4          ; <=
  365.     MOVE.W  D4,(A1)+
  366.     BRA PARSELOOP
  367. .2: MOVEQ   #16,D4          ; <>
  368.     MOVE.W  D4,(A1)+
  369.     ADDQ.L  #1,A0
  370.     BRA PARSELOOP
  371. .3: MOVEQ   #40,D4          ; <=>
  372.     MOVE.W  D4,(A1)+
  373.     ADDQ.L  #1,A0
  374.     BRA PARSELOOP
  375. .4: MOVEQ   #49,D4
  376.     ADDQ.L  #1,A0
  377.     MOVE.W  D4,(a1)+
  378.     BRA     PARSELOOP
  379. ;*-*
  380. ;; := : :: :=:
  381. PARSEBECOMES:
  382.     CMP.B   #'=',D6
  383.     BNE.S   .1
  384.     CMP.B   #':',1(A0)      ; :=:
  385.     BEQ     .3
  386.     MOVEQ   #ASSGN,D4       ; :=
  387.     MOVE.W  D4,(A1)+
  388.     MOVE.B  (A0)+,D7
  389.     BRA PARSELOOP
  390. .1: CMP.B   #':',D6
  391.     BNE.S   .2
  392.     MOVEQ   #41,D4          ; ::
  393.     MOVE.W  D4,(A1)+
  394.     MOVE.B  (A0)+,D7
  395.     BRA PARSELOOP
  396. .2: MOVEQ   #19,D4          ; :
  397.     MOVE.W  D4,(A1)+
  398.     BRA PARSELOOP
  399. .3: MOVEQ   #53,D4          ; :=:
  400.     MOVE.W  D4,(A1)+
  401.     ADDq.L  #2,A0
  402.     BRA     PARSELOOP
  403. ;*-*
  404. ;; "("
  405. PARSEOPEN:            ; (
  406.     MOVEQ   #17,D4
  407.     MOVE.W  D4,(A1)+
  408.     TST.W   PARSEBRACKET
  409.     BNE.S   .1
  410.     MOVE.L  A0,BRAKPOS
  411.     MOVE.L  LINENUM,BRAKLINE
  412. .1: ADDQ.W  #1,PARSEBRACKET
  413.     BRA PARSELOOP
  414. ;*-*
  415. ;; ")"
  416. PARSECLOSE:           ; )
  417.     MOVEQ   #18,D4
  418.     MOVE.W  D4,(A1)+
  419.     TST.W   PARSEBRACKET
  420.     BEQ iERROR20
  421.     SUBQ.W  #1,PARSEBRACKET
  422.     BRA PARSELOOP
  423. ;*-*
  424. ;; "?"
  425. QMARK:
  426.     MOVEQ   #52,D4
  427.     MOVE.W  D4,(A1)+
  428.     BRA     PARSELOOP
  429. ;*-*
  430. PARSEBRACKET: DC.W    0
  431. BRAKPOS:      DC.L    0
  432. BRAKLINE:     DC.L    0
  433. SQBRAKPOS:    DC.L    0
  434. SQBRAKLINE:   DC.L    0
  435.  
  436. ID:
  437. PARSEIDENT:
  438.     MOVEQ   #0,D5           ; D5=HASHVALUE!!!
  439. .3: HASHC   D5,D7
  440.     MOVE.B  D7,(A2)+        ; IDENT
  441.     CMP.B   #123,D6
  442.     BPL.S   .4
  443.     CMP.B   #97,D6
  444.     BPL .2
  445.     CMP.B   #91,D6
  446.     BPL.S   .5
  447.     CMP.B   #65,D6
  448.     BPL .2
  449.     CMP.B   #58,D6
  450.     BPL.S   .4
  451.     CMP.B   #48,D6
  452.     BPL .2
  453. .4: CLR.B   (A2)+           ; IDENT FINISHED
  454.     MOVE.B  #-1,(A2)+
  455.     HASHE   D5
  456.     MOVE.L  D5,HASHVAL
  457.     MOVE.L  WORK,A2
  458.     BTST    #7,CODEPREFS+1
  459.     BEQ.S   .NMAC
  460.     BSR PREPEXPAND
  461. .NMAC:  MOVE.B  (A2),D0
  462.     CMP.B   #'_',D0
  463.     BMI.S   PARSEUPPER
  464.     BRA.S   PARSELOWER
  465. .2: MOVE.B  (A0)+,D7
  466.     MOVE.B  (A0),D6
  467.     BRA.S   .3
  468. .5: CMP.B   #'_',D6
  469.     BEQ.S   .2
  470.     BRA.S   .4
  471.  
  472. HASHVAL:  DC.L    0       ; IDENT HASHVALUE!!!
  473. INPROC:   DC.W    0
  474. REGSTOP:  DC.W    0
  475.  
  476. PARSELOWER:
  477.     BSR PARSEGETIDENTNR
  478.     MOVE.L  WORK,A2
  479.     BRA PARSELOOP
  480.  
  481. PARSEUPPER:
  482.     MOVE.B  1(A2),D0        ; INS or Ins or Rx
  483.     CMP.B   #58,D0
  484.     BMI ASM_PARSEREG
  485. REGBACK:
  486.     CMP.B   #'a',D0
  487.     BPL PARSEUPLOW
  488.     CMP.B   #'.',(A0)
  489.     BEQ PARSECONSTASM
  490.     BSR.W   PARSEGETINSNR       ; INS
  491.     TST.W   D0
  492.     BEQ PARSECONSTASM
  493.  
  494.     LEA .TAB-(4*IOFF)(PC),A3
  495.     MOVE.L  D0,D1
  496.     LSL.W   #2,D1
  497.     MOVE.L  0(A3,D1.W),A3
  498.     JMP (A3)
  499.  
  500. .TAB:
  501.     DC.L    .P,   .EP,  .DONE,.DONE,.DONE,.DONE ; PROC .. WHILE
  502.     DC.L    .DONE,.DONE,.DONE,.DONE,.DONE,.DONE ; ENDW .. DEFAULT
  503.     DC.L    .DONE,.DONE,.DONE,.DONE,.D,   .DONE ; ENDS .. LOCAL
  504.     DC.L    .DONE,.DONE,.DONE,.DONE,.DONE,.DONE ; ELSE .. INC
  505.     DC.L    .DONE,.DONE,.DONE,.DONE,.DONE,.DONE ; DEC  .. AND
  506.     DC.L    .DONE,.RESO,.RESO,.RESO,.DONE,.DONE ; OR   .. EXIT
  507.     DC.L    .DONE,.DONE,.DONE,.DONE,.DONE,.DONE ; LARG .. ARRAY
  508.     DC.L    .DONE,.DONE,.DONE,.DONE,.DONE,.DONE ; STRI .. LIST
  509.     DC.L    .OBJ, .EOBJ,.DONE,.EP2, .DONE,.RESO ; OBJE .. ENUM
  510.     DC.L    .RESO,.DONE,.HAND,.DONE,.RSE, .EXP  ; SET  .. EXPORT
  511.     DC.L    .REG, .DONE,.EP,  .DONE,.DONE,.DONE ; REG  .. PRIVATE
  512.     DC.L    .DONE,.DONE,.RESO,.DONE,.DONE,.DONE ; SUPE .. NOSTARTUP
  513.     DC.L    .DONE,.DONE,.DONE,.DONE,.RESO,.DONE ; LINK .. STARTUP
  514.     DC.L    .DONE,.DONE,.DONE,.DONE,.DONE,.DONE ; WITH .. SECTION
  515.     DC.L    .DONE,.DONE,.DONE,.DONE,.DONE,.DONE ; CODE ..
  516.     DC.L    .DONE,.DONE,.DONE,.DONE,.DONE,.DONE ;
  517.  
  518. ;; .RESO
  519. .RESO:
  520.     TST.L   CONSTD
  521.     BNE .SER
  522.     MOVE.L  A1,CONSTD
  523.     MOVE.L  LINENUM,LINENUMZ
  524.     MOVE.W  D0,(A1)+
  525.     MOVE.W  D0,D4
  526.     MOVE.L  WORK,A2
  527.     BRA PARSELOOP
  528. ;*-*
  529. ;; .BRAK
  530. .BRAK:
  531.     TST.W   PARSEBRACKET
  532.     BNE iERROR20
  533.     RTS
  534. ;*-*
  535. ;; .DONE
  536. .DONE:
  537.     MOVE.W  D0,(A1)+
  538.     MOVE.W  D0,D4
  539.     TST.W   MAXREGALLOC
  540.     BNE .HEAVY          ; DO REGALLOC STATS
  541. .HB:MOVE.L  WORK,A2
  542.     BRA PARSELOOP
  543. ;*-*
  544. ;; .P
  545. .P: MOVE.W  #-1,.DEFF
  546.     MOVE.W  #-1,INPROC
  547.     MOVE.W  #-1,SCOPE
  548.     CLR.W   REGSTOP
  549.     BSR.S   .BRAK
  550.     BRA.S   .RESO
  551. .EP2:
  552.     CMP.W   #18,D4          ; RETURN PREC ")" OR <OBJ>
  553.     BEQ.S   .EP
  554.     CMP.W   #31,D4
  555.     BNE.S   .DONE
  556. ;*-*
  557. ;; .EP
  558. .EP:CLR.W   INPROC
  559.     CLR.W   SCOPE
  560.     BSR.S   .BRAK
  561.     BRA .DONE
  562. ;*-*
  563. ;; .OBJ
  564. .OBJ:
  565.     MOVE.L  #-1,OBJECTD
  566.     CLR.L   OBJNAME
  567.     BRA.S   .DONE
  568. ;*-*
  569. ;; .EOBJ
  570. .EOBJ:
  571.     CLR.L   OBJECTD
  572.     BRA.S   .DONE
  573. ;*-*
  574. ;; .D
  575. .D: TST.L   CONSTD
  576.     BNE iERROR12
  577.     TST.W   .DEFF
  578.     BEQ     .DONE
  579.     MOVE.L  #IOFF+17,D0     ; SET DEF TO LOCAL
  580.     MOVE.W  #17,CURINS      ; FIX
  581.     BRA.W   .DONE
  582. .DEFF:  DC.W    0
  583. ;*-*
  584. ;; .RSE
  585. .RSE:
  586.     MOVE.W  #-1,BUSYRAISE
  587.     BRA .RESO
  588. ;*-*
  589. ;; .SER
  590. .SER:
  591.     CMP.W   #IOFF+33,D0
  592.     BNE iERROR12
  593.     BRA .DONE
  594. ;*-*
  595. ;; .EXP
  596. .EXP:
  597.     MOVE.W  #-1,EXPORTFLAG
  598.     TSTMOD
  599.     BEQ iERROR49
  600.     BRA .DONE
  601. ;*-*
  602. ;; .HAND
  603. .HAND:
  604.     MOVE.L  CPROC(PC),A2
  605.     BSET    #2,2(A2)        ; SET NO_REGALLOC
  606.     MOVE.W  #1,REGSTOP
  607.     BRA .DONE
  608. ;*-*
  609. ;; .REG
  610. .REG:
  611.     CMP.W   #19,D4
  612.     BNE .DONE
  613.     MOVE.L  LASTID(PC),D1
  614.     BEQ .DONE
  615.     MOVE.L  D1,A3
  616.  
  617.     BTST    #3,5(A3)        ; SET REG!
  618.     BNE iERROR50
  619.     BSET    #3,5(A3)
  620.     MOVE.L  6(A3),A6        ; A6=PROC
  621.     TST.W   REGSTOP
  622.     BNE iERROR56         ; NO :REG IN HANDLE
  623.     ADDQ.B  #1,3(A6)
  624.     MOVE.B  3(A6),D7
  625.     EXT.W   D7
  626.     CMP.W   #MAXREGVARS+1,D7
  627.     BPL iERROR56         ; TOOMUCH regvars per proc
  628.     NEG.W   D7
  629.     ADDQ.W  #8,D7
  630.     MOVE.W  D7,10(A3)       ; set regnum instead of offset
  631.  
  632.     BRA .DONE
  633. ;*-*
  634. ; UPDATE HEAVYNESS FACTOR ACCORDING TO KEYWORDS (KEY=D4)
  635. ;; .HEAVY
  636. .HEAVY:
  637.     TST.W   REGSTOP
  638.     BNE .HB
  639.     MOVE.B  HEAVYTABLE-IOFF(PC,D4),D0
  640.     MOVE.L  HEAVYNESS,D1        ; D1 BECOMES NEW HEAVYNESS
  641.     EXT.W   D0
  642.     CMP.B   #"s",D0
  643.     BEQ.S   .SET1
  644.     CMP.B   #"m",D0
  645.     BEQ.S   .LOOP
  646.     CMP.B   #"d",D0
  647.     BEQ.S   .ELOOP
  648.     CMP.B   #"i",D0
  649.     BEQ.S   .IF
  650.     CMP.B   #"e",D0
  651.     BEQ.S   .EIF
  652.     CMP.B   #"D",D0
  653.     BEQ.S   .DO
  654.     CMP.B   #"S",D0
  655.     BEQ.S   .SEL
  656.     CMP.B   #"U",D0
  657.     BEQ.S   .UNTIL
  658.     CMP.B   #"E",D0
  659.     BEQ.S   .ESEL
  660. .HEND:
  661.     CMP.L   #1,D1
  662.     BPL.S   .HEND2
  663.     MOVEQ   #1,D1
  664. .HEND2:
  665.     MOVE.L  D1,HEAVYNESS
  666.     BRA .HB
  667. ;*-*
  668. ;; .SET1
  669. .SET1:
  670.     MOVE.L  #MIDHEAVY,D1
  671.     BRA.S   .HEND
  672. ;*-*
  673. ;; .LOOP
  674. .LOOP:
  675.     LSL.L   #3,D1
  676.     ADDQ.W  #3,POSTDFACTOR
  677.     BRA.S   .HEND
  678. ;*-*
  679. ;; .ELOOP
  680. .ELOOP:
  681.     LSR.L   #3,D1
  682.     BRA.S   .HEND
  683. ;*-*
  684. ;; .IF
  685. .IF:
  686.     ADDQ.W  #1,POSTDFACTOR
  687.     MOVE.W  #1,POSTACTION
  688.     BRA.S   .HEND
  689. ;*-*
  690. ;; .EIF
  691. .EIF:
  692.     LSL.L   #1,D1
  693.     BRA.S   .HEND
  694. ;*-*
  695. ;; .SEL
  696. .SEL:
  697.     LSL.L   #4,D1
  698.     MOVE.W  #2,POSTACTION
  699.     BRA.S   .HEND
  700. ;*-*
  701. ;; .ESEL
  702. .ESEL:
  703.     LSL.L   #2,D1
  704.     BRA.S   .HEND
  705. ;*-*
  706. ;; .DO
  707. .DO:MOVE.W  #1,POSTACTION
  708.     CMP.W   #IOFF+25,D4     ; then?
  709.     BNE.S   .HEND
  710.     LSR.L   #1,D1
  711.     ADDQ.W  #1,POSTMFACTOR
  712.     SUBQ.W  #1,POSTDFACTOR
  713.     BRA.S   .HEND
  714. ;*-*
  715. ;; .UNTIL
  716. .UNTIL:
  717.     ADDQ.W  #3,POSTDFACTOR
  718.     MOVE.W  #1,POSTACTION
  719.     BRA.S   .HEND
  720. ;*-*
  721. ;; HEAVY - Data
  722. HEAVYNESS:  DC.L    MIDHEAVY
  723. POSTMFACTOR:    DC.W    0
  724. POSTDFACTOR:    DC.W    0
  725. POSTACTION: DC.W    0       ; WHAT TO DO AT EOLN
  726.                     ; 0=NOP, 1=FAC, 2=SEL
  727. HEAVYTABLE:
  728.         DC.B "ssie mdmdS  EmU"  ; PROC-UNTIL
  729.         DC.B "          DmdD "  ; JUMP-AND
  730.         DC.B "               "  ; OR-PTR
  731.         DC.B "            s  "  ; OF-EXPORT
  732.         DC.B "               "  ; REG...
  733.         DC.B "               "
  734.         EVEN
  735.  
  736. ; s h:=8        start of PROC etc.
  737. ; m h:=h*8      start of loop
  738. ; d h:=h/8      end of loop
  739. ; i lf;h:=h/2   if
  740. ; e h:=h*2      endif
  741. ; E h:=h*4      endselect
  742. ; S h:=h*16;lf;/4   select
  743. ; D lf      do/then
  744. ; U lf;h:=h/8   until
  745. ;*-*
  746. POSTOPTI:
  747.  
  748. ;   MOVE.W  LINENUM,D0      ; WRITE TABLE AT $1E0000
  749. ;   MOVE.L  #$1E0000,A2
  750. ;   LSL.W   #2,D0
  751. ;   ADD.W   D0,A2
  752. ;   MOVE.L  HEAVYNESS,(A2)
  753.  
  754.     TST.W   MAXREGALLOC
  755.     BEQ.S   .E
  756.     TST.W   REGSTOP
  757.     BNE.S   .E
  758.     TST.W   POSTACTION
  759.     BEQ.S   .EC
  760.     MOVEM.L D0/D1,-(A7)
  761.     MOVE.L  HEAVYNESS(PC),D1
  762.     MOVE.W  POSTACTION(PC),D0
  763.     CMP.W   #1,D0
  764.     BNE.S   .S
  765.     MOVE.W  POSTMFACTOR(PC),D0
  766.     LSL.L   D0,D1
  767.     MOVE.W  POSTDFACTOR(PC),D0
  768.     LSR.L   D0,D1
  769.     BRA.S   .R
  770. .S: LSR.L   #6,D1           ; /16/4
  771. .R: CMP.L   #1,D1
  772.     BPL.S   .O
  773.     MOVEQ   #1,D1
  774. .O: MOVE.L  D1,HEAVYNESS
  775.     MOVEM.L (A7)+,D0/D1
  776.     CLR.W   POSTACTION
  777. .EC:CLR.L   POSTMFACTOR
  778. .E: RTS
  779.  
  780. CONSTD:       DC.L    0
  781. OBJECTD:      DC.L    0
  782. BUSYRAISE:    DC.W    0
  783.  
  784. ;; CONST/Assembler
  785. PARSECONSTASM:
  786.     MOVE.L  WORK,A2
  787.     BSR     ASM_PARSE
  788.     MOVE.L  WORK,A2
  789.     TST.L   D0
  790.     BNE PARSELOOP
  791.  
  792.     MOVE.L  #CONSTHASH,A3
  793.     MOVE.L  HASHVAL,D0
  794.     LSL.L   #2,D0
  795.     ADD.L   D0,A3           ; A3=START CONST TABEL
  796.  
  797.     MOVE.L  A3,A6           ; A6=BACKUP
  798. .1: MOVE.L  (A3),A3
  799.     MOVE.L  A3,D0
  800.     BEQ .3
  801.     MOVE.L  CASCII(A3),A4       ; A4=ASCIIPTR
  802.     MOVE.L  WORK,A5     ; A5=THIS CONST
  803. .2: CMPM.B  (A4)+,(A5)+
  804.     BNE.S   .1
  805.     CMP.B   #0,-1(A4)
  806.     BNE.S   .2
  807.     btst    #1,CFLAGS(a3)
  808.     bne     .STRING
  809.     MOVEQ   #VALUE,D4
  810.     MOVE.W  D4,(A1)+
  811.     MOVE.L  CVAL(A3),(A1)+
  812.     MOVE.L  WORK,A2
  813.     BRA PARSELOOP
  814.  
  815. .STRING:
  816.     moveq   #STR,D4
  817.     move.w  d4,(a1)+
  818.     move.l  CVAL(a3),a2
  819.     move.w  (a2),d0
  820.     move.w  d0,(a1)+
  821.     addq.l  #1,d0
  822.     btst    #0,d0
  823.     beq     .T0
  824.     addq.l  #1,d0
  825. .T0:lsr.w   #1,d0
  826.     move.w  d0,(a1)+
  827.     move.w  (a2)+,d0
  828.     subq.l  #1,d0
  829. .TST:
  830.     move.b  (a2)+,(a1)+
  831.     dbf     d0,.TST
  832.     clr.b   (a1)+
  833.     move.l  a1,d0
  834.     btst    #0,d0
  835.     beq     .T1
  836.     clr.b   (a1)+
  837. .T1:MOVE.L  WORK,A2
  838.     BRA PARSELOOP
  839.  
  840.  
  841. .3: TST.L   CONSTD          ; MAKE NEW CONSTANT
  842.     BEQ.S   .ER
  843.     GETM    A3
  844.     MOVE.L  A3,D0
  845.     MOVE.L  WORK,A4
  846. .4: MOVE.B  (A4)+,(A3)+
  847.     BNE .4
  848.     MOVE.L  A3,D4
  849.     BTST    #0,D4
  850.     BEQ.S   .5
  851.     CLR.B   (A3)+
  852. .5: DONEM   A3
  853.     MOVEQ   #25,D4
  854.     MOVE.W  D4,(A1)+
  855.     MOVE.L  D0,(A1)+
  856.     MOVE.L  A6,(A1)+        ; HASHENTRY
  857.     MOVE.L  WORK,A2
  858.     BRA PARSELOOP
  859. .ER:MOVE.L  WORK,ERROROBJ
  860.     BRA iERROR1
  861. ;*-*
  862. ;; EFunction
  863.  
  864. XF:   DC.W    0       ; 0=NO F-FUNC, -1=F
  865.  
  866. PARSEUPLOW:           ; Ins
  867.     BSR PARSELIBFUNCTION
  868.     TST.L   D4
  869.     BNE PLIBOUT
  870.     LEA EFUNCTAB,A3     ; IT MIGHT BE AN E FUNCTION!
  871.     MOVEQ   #0,D3
  872.     MOVEQ   #0,D1
  873. .1: MOVE.L  (A3)+,A4        ; ASC
  874.     CMP.L   A4,D1
  875.     BEQ     MIGHTBELIB
  876.     ADD.L   #EFUNCENTRYSIZE-4,A3
  877.     MOVE.L  A2,A5
  878.     ADDQ.L  #1,D3
  879. .2: CMPM.B  (A4)+,(A5)+
  880.     BNE.S   .1
  881.     CMP.B   #0,(A4)
  882.     BNE.S   .2
  883.     CMP.B   #0,(A5)
  884.     BNE.S   .2
  885.     CMP.B   #'F',-1(A4)
  886.     BNE.S   .3
  887.     MOVE.W  #-1,XF
  888.     BRA.S   .4
  889. .3: CLR.W   XF
  890. .4: SUB.L   #16,A3
  891.     MOVEQ   #22,D4
  892.     MOVE.W  D4,(A1)+
  893.     MOVE.L  A3,(A1)+
  894.  
  895.     MOVEM.L D0/A1,-(A7)
  896.     LEA EFUNCFLAGSTAB,A1
  897.     lsl.l   #2,d3
  898.     MOVE.L  -4(A1,D3.W),D0
  899.     lsr.l   #2,d3
  900.     BTST    #0,D0
  901.     BEQ     .B0
  902.     BSET    #3,CODEPREFS+1
  903. .B0:BTST    #1,D0
  904.     BEQ     .B1
  905.     BSET    #4,CODEPREFS+1
  906. .B1:BTST    #9,D0
  907.     BEQ     .B2
  908.     BSET    #7,CODEPREFS
  909. .B2:BTST    #10,D0
  910.     BEQ     .B3
  911.     BSET    #3,CODEPREFS
  912. .B3:BTST    #11,D0
  913.     BEQ     .B4
  914.     BSET    #6,CODEPREFS
  915. .B4:BTST    #8,D0
  916.     BNE     .INLINE
  917.     MOVE.L  #EFUNCBYTE,A3
  918.     MOVE.B  #-1,-1(A3,D3)
  919. .INLINE:
  920.     MOVEM.L (A7)+,D0/A1
  921.  
  922.     BRA.S   PLIBOUT
  923. ;*-*
  924. ;; Library call
  925. MIGHTBELIB:
  926.     MOVE.L  WORK,A2
  927.     MOVE.L  ACODE,A3        ; IT MIGHT BE A LIBRARY CALL!
  928.     MOVEQ   #0,D1           ; (WE USE ASMCODE BUF !!!)
  929. .1: MOVE.L  (A3)+,A4        ; ASC
  930.     CMP.L   A4,D1
  931.     BEQ.S   PNOLIB
  932.     MOVE.L  (A3)+,D0        ; D0=OFFSETS
  933.     MOVE.W  (A3)+,D2        ; D2=EXCEPTION
  934.     MOVE.L  A2,A5
  935. .2: CMPM.B  (A4)+,(A5)+
  936.     BNE.S   .1
  937.     CMP.B   #32,(A4)
  938.     BPL.S   .2
  939.     CMP.B   #32,(A5)
  940.     BPL.S   .2
  941.     MOVEQ   #LIBC,D4
  942.     TST.W   BUSYRAISE
  943.     BNE.S   .RAISE
  944.     MOVE.W  D4,(A1)+
  945.     MOVE.L  D0,(A1)+
  946.     MOVEQ   #0,D0
  947.     MOVEQ   #0,D1           ; MOVEM.L MASK
  948.     MOVE.L  A4,(A1)+
  949. .4: MOVE.B  (A4)+,D0
  950.     CMP.W   #16,D0
  951.     BPL.S   .3
  952.     BSET    D0,D1
  953.     BRA.S   .4
  954. .3: MOVE.W  D1,(A1)+
  955.     MOVE.W  D2,(A1)+        ; PUT EXCEPTION #
  956.     BRA.S   PLIBOUT
  957. .RAISE: LEA -10(A3),A3
  958.     MOVE.W  #38,(A1)+
  959.     MOVE.L  A3,(A1)+
  960.     BRA.S   PLIBOUT
  961. PNOLIB:               ; WHAT ELSE?
  962.     MOVE.L  WORK,ERROROBJ
  963.     BRA iERROR24
  964. PLIBOUT:
  965.     MOVE.L  WORK,A2
  966.     BRA PARSELOOP
  967. ;*-*
  968. ;; LibFunction
  969. PARSELIBFUNCTION:
  970. ; quite intelligent :)
  971. ; searches the whole list for best match
  972. ; (note it checks for best matching CPU, FPU, MMU and OSVersion)
  973. ; the highest priority has the cpu required.
  974. ; so __OSVERSION=37 is same as __CPU=020 or (_FPU=68040 and _MMU=68040)
  975.     MOVE.W  #-32768,.RES1
  976.     CLR.L   .RES2
  977.     clr.w   .RES3
  978.     MOVE.L  D0,-(A7)
  979.     MOVE.L  HASHVAL,D0
  980.     LSL.W   #2,D0
  981.     MOVE.L  #LIBHASH,A3
  982.     ADD.L   D0,A3
  983.     ADDQ.L  #4,A3
  984. .FIND:
  985.     MOVE.L  LIB_NEXT(A3),D0
  986.     BEQ     .NFOUND
  987.     MOVE.L  D0,A3
  988.     MOVE.L  LIB_NAME(A3),A4
  989.     MOVE.L  A2,A5
  990. .CHK:
  991.     CMPM.B  (A4)+,(A5)+         ; search for function
  992.     BNE .FIND
  993.     TST.B   -1(A4)
  994.     BNE .CHK
  995.     TST.B   -1(A5)
  996.     BNE .CHK
  997.     move.w  #-1,.RES3
  998.     move.w  TCPU,d4
  999.     cmp.w   LIB_CPU(A3),d4
  1000.     blt     .CHK
  1001.     MOVE.W  LIB_CPU(A3),D0
  1002.     DIVU.W  #5,D0
  1003.     move.w  EFPU,D4
  1004.     cmp.w   LIB_FPU(A3),d4
  1005.     blt     .CHK
  1006.     ADD.W   LIB_FPU(A3),D0
  1007.  
  1008.     move.w  EMMU,D4
  1009.     cmp.w   LIB_MMU(A3),D4
  1010.     blt     .CHK
  1011.     ADD.W   LIB_MMU(A3),D0
  1012.  
  1013.     move.w  OSVERSION,D4
  1014.     cmp.w   LIB_OSVERS(A3),D4
  1015.     blt     .CHK
  1016.  
  1017.     ADD.W   LIB_OSVERS(A3),D0
  1018.     SUB.W   #33,D0
  1019.     CMP.W   .RES1,D0
  1020.     BLT     .CHK
  1021.     MOVE.W  D0,.RES1
  1022.     MOVE.L  A3,.RES2
  1023.     BRA     .CHK
  1024. .FOUND:
  1025.     MOVEQ   #54,D4
  1026.     move.w  d4,(a1)+
  1027.     MOVE.L  .RES2,A3
  1028.     move.l  A3,(a1)+
  1029.     move.l  #-1,LIB_USED(a3)      ; set "used"
  1030.     MOVE.L  (A7)+,D0
  1031.     rts
  1032. .NFOUND:
  1033.     TST.L   .RES2
  1034.     BNE .FOUND
  1035.     tst.w   .RES3
  1036.     BNE iERROR107
  1037.     moveq   #0,d4
  1038.     MOVE.L  (A7)+,D0
  1039.     rts
  1040. .RES1:
  1041.     DC.W    0
  1042. .RES2:
  1043.     DC.L    0
  1044. .RES3:
  1045.     DC.W    0
  1046. ;*-*
  1047. ;; VALUES
  1048. VAL:
  1049. ;; DEC
  1050. PARSEVALUE:
  1051. .2: MOVE.B  D7,(A2)+
  1052.     MOVE.B  (A0)+,D7
  1053.     CMP.B   #58,D7
  1054.     BPL.S   .1
  1055.     CMP.B   #48,D7
  1056.     BPL .2
  1057.     CMP.B   #".",D7
  1058.     BEQ.S   .2
  1059. .1: SUBQ.L  #1,A0
  1060.     MOVE.B  #0,(A2)+        ; VALUE FINISHED
  1061.     MOVE.L  WORK,A2
  1062.     BSR PARSEGETVALUE
  1063.     MOVE.L  WORK,A2
  1064.  
  1065.     MOVEQ   #VALUE,D4
  1066.     TST.L   D7
  1067.     BEQ.S   .3
  1068.     ADD.W   #42,D4          ; FLOAT
  1069. .3:
  1070.     MOVE.W  D4,(A1)+
  1071.     MOVE.L  D0,(A1)+
  1072.     BRA PARSELOOP
  1073. ;*-*
  1074. ;; HEX
  1075. PARSEHEXNUM:
  1076.     MOVE.L  WORK,A2
  1077.     MOVE.L  A2,D3
  1078.     MOVEQ   #0,D1           ; RESULT
  1079.     MOVEQ   #0,D2           ; #OF SHIFTS
  1080. .4: MOVE.B  (A0)+,D0
  1081.     CMP.B   #"G",D0
  1082.     BPL.S   .2B
  1083.     CMP.B   #"0",D0
  1084.     BMI.S   .1
  1085.     CMP.B   #"9"+1,D0
  1086.     BPL.S   .2
  1087. .3: MOVE.B  D0,(A2)+
  1088.     BRA.S   .4
  1089. .1: CMP.L   A2,D3
  1090.     BEQ.S   .5
  1091.     MOVEQ   #0,D0
  1092.     MOVE.B  -(A2),D0
  1093.     SUB.B   #48,D0
  1094.     CMP.W   #32,D2
  1095.     BEQ iERROR7
  1096.     LSL.L   D2,D0
  1097.     ADD.L   D0,D1
  1098.     ADDQ.L  #4,D2
  1099.     BRA.S   .1
  1100. .5: MOVEQ   #VALUE,D4
  1101.     MOVE.W  D4,(A1)+
  1102.     MOVE.L  D1,(A1)+
  1103.     SUBQ.L  #1,A0
  1104.     MOVE.L  WORK,A2
  1105.     BRA PARSELOOP
  1106. .2: CMP.B   #"A",D0
  1107.     BMI.S   .1
  1108.     SUB.B   #7,D0
  1109.     BRA.S   .3
  1110. .2B:    CMP.B   #"a",D0
  1111.     BMI.S   .1
  1112.     CMP.B   #"g",D0
  1113.     BPL.S   .1
  1114.     SUB.B   #7+32,D0
  1115.     BRA.S   .3
  1116. ;*-*
  1117. ;; BIN
  1118. PARSEBINNUM:
  1119.     MOVE.L  WORK,A2
  1120.     MOVE.L  A2,D3
  1121.     MOVEQ   #0,D1           ; RESULT
  1122.     MOVEQ   #0,D2           ; BITNUM
  1123. .4: MOVE.B  (A0)+,D0
  1124.     CMP.B   #"1",D0
  1125.     BEQ.S   .R
  1126.     CMP.B   #"0",D0
  1127.     BNE.S   .1
  1128. .R: MOVE.B  D0,(A2)+
  1129.     BRA.S   .4
  1130. .1: CMP.L   A2,D3
  1131.     BEQ.S   .5
  1132.     MOVEQ   #0,D0
  1133.     MOVE.B  -(A2),D0
  1134.     SUB.B   #"0",D0
  1135.     BEQ.S   .NS
  1136.     BSET    D2,D1
  1137. .NS:    CMP.W   #32,D2
  1138.     BEQ iERROR7
  1139.     ADDQ.L  #1,D2
  1140.     BRA.S   .1
  1141. .5: MOVEQ   #VALUE,D4
  1142.     MOVE.W  D4,(A1)+
  1143.     MOVE.L  D1,(A1)+
  1144.     SUBQ.L  #1,A0
  1145.     MOVE.L  WORK,A2
  1146.     BRA PARSELOOP
  1147. ;*-*
  1148. ;; STR
  1149. PARSELONGSTR:
  1150.     MOVEQ   #0,D0           ; RESULT
  1151.     MOVEQ   #24,D1          ; SHIFTCOUNT
  1152. .1: MOVEQ   #0,D2
  1153.     MOVE.B  (A0)+,D2
  1154.     CMP.B   #34,D2
  1155.     BEQ.S   .2
  1156.     CMP.B   #10,D2
  1157.     BEQ iERROR8
  1158.     CMP.L   #-8,D1
  1159.     BEQ iERROR8
  1160.     CMP.B   #"\",D2
  1161.     BEQ.S   .SP
  1162. .SPB:
  1163.     LSL.L   D1,D2
  1164.     ADD.L   D2,D0
  1165.     SUBQ.L  #8,D1
  1166.     BRA.S   .1
  1167. .2: ADDQ.L  #8,D1           ; 0,32=NOSHIFT
  1168.     CMP.W   #32,D1
  1169.     BPL.S   .3
  1170.     TST.W   D1
  1171.     BEQ.S   .3
  1172.     LSR.L   D1,D0
  1173. .3: MOVEQ   #VALUE,D4
  1174.     MOVE.W  D4,(A1)+
  1175.     MOVE.L  D0,(A1)+
  1176.     MOVE.L  WORK,A2
  1177.     BRA PARSELOOP
  1178. .SP:
  1179.     MOVE.B  (A0)+,D2
  1180.     CMP.B   #"x",D2
  1181.     bEQ     .EXTHEX
  1182.     LEA .SPT(PC),A3
  1183. .SPL:
  1184.     ADDQ.L  #1,A3
  1185.     CMP.B   (A3),D2
  1186.     BEQ.S   .SPD
  1187.     TST.B   (A3)+
  1188.     BNE.S   .SPL
  1189.     BRA iERROR26
  1190. .SPD:
  1191.     MOVE.B  -(A3),D2
  1192.     BRA.S   .SPB
  1193.  
  1194. .EXTHEX:
  1195.     MOVEM.L D0-D1/D3-D7/A1-A6,-(A7)
  1196.     MOVEQ   #1,D0
  1197.     MOVEQ   #0,D1
  1198. .LP:
  1199.     MOVE.B  (A0)+,D2
  1200.     CMP.B   #"0",D2
  1201.     BLT     iERROR72
  1202.     CMP.B   #"9",D2
  1203.     BLE     .DEC
  1204.     CMP.B   #"A",D2
  1205.     BLT     iERROR72
  1206.     CMP.B   #"F",D2
  1207.     BLE     .HEX
  1208.     CMP.B   #"a",D2
  1209.     BLT     iERROR72
  1210.     CMP.B   #"f",D2
  1211.     BGT     iERROR72
  1212.     BCLR    #5,D2
  1213. .HEX:
  1214.     SUB.B   #"A"+10,D2
  1215.     AND.B   #$F,D2
  1216.     OR.B    D2,D1
  1217.     BRA     .X
  1218. .DEC:
  1219.     SUB.B   #"0",D2
  1220.     AND.B   #$F,D2
  1221.     OR.B    D2,D1
  1222. .X: LSL.W   #4,D1
  1223.     DBF     D0,.LP
  1224.     MOVE.L  D1,D2
  1225.     LSR.W   #4,D2
  1226.     MOVEM.L (A7)+,D0-D1/D3-D7/A1-A6
  1227.     BRA     .SPB
  1228.  
  1229.  
  1230.  
  1231. .SPT:   DC.B    10,"n",39,"a",34,"q",27,"e",9,"t","\","\",0,"0",13,"b",11,"v"
  1232. ;*-*
  1233. ;*-*
  1234.  
  1235. CONTINUETAB:
  1236.         DC.B    0,0,1,1,1,0,0           ; EOS .. STR
  1237.         DC.B    1,1,1,1,1,0,1,1,1,0,1,0 ; "+" .. ")"
  1238.         DC.B    0,0,0,1,1,0,0,0,0,0     ; ":" .. ".B"
  1239.         DC.B    1,0,0,1,0,0,1,1,0       ; "[" .. "|"
  1240.         DC.B    1,0,1,1,0               ; LIB .. OBJA
  1241.         DC.B    0,0,0,0,0,0,0,0,0,0,0,0 ; ..
  1242.         DC.B    0,0,0,0,0,0,0,0,0,0,0,0 ; ..
  1243.         DC.B    0,0,0,0,0,0,0,0,0,0,0,0 ; ..
  1244.         EVEN
  1245.  
  1246. PARSEENDLINE:
  1247.     CMP.L   ENDECODE(PC),A0
  1248.     BPL.S   .SKIP
  1249.     CMP.W   #IOFF+65,D4
  1250.     BPL.S   .SKIP
  1251.     TST.W   D4
  1252.     BMI.S   .SKIP
  1253.     CMP.L   #BRACKETSBUF,CURBRACK       ; OPEN [ ( COUNT
  1254.     BNE PCONTINUE
  1255.     TST.W   PARSEBRACKET
  1256.     BNE PCONTINUE
  1257.     CMP.W   #IOFF,D4
  1258.     BPL.S   .2TAB
  1259.     MOVE.B  CONTINUETAB(PC,D4.W),D0
  1260.     BNE PCONTINUE
  1261.     BRA.S   .1
  1262. .2TAB:
  1263.     MOVE.B  CONTINUEKEY-IOFF(PC,D4.W),D0
  1264.     BNE PCONTINUE
  1265.     BRA.S   .1
  1266. .SKIP:
  1267.     CMP.L   #BRACKETSBUF,CURBRACK
  1268.     BEQ.S   .1C
  1269.     MOVE.L  SQBRAKPOS(PC),D0
  1270.     BEQ.S   .1D
  1271.     MOVE.L  D0,A0
  1272.     MOVE.L  SQBRAKLINE(PC),LINENUM
  1273. .1D:BRA iERROR34
  1274. .1C:TST.W   PARSEBRACKET
  1275.     BEQ.S   .1
  1276.     MOVE.L  BRAKPOS(PC),D0
  1277.     BEQ.S   .1B
  1278.     MOVE.L  D0,A0
  1279.     MOVE.L  BRAKLINE(PC),LINENUM
  1280. .1B:BRA iERROR20
  1281. .1: MOVE.L  CONSTD(PC),D0
  1282.     BNE RESOLVECONST
  1283. RESBACK:
  1284.     BTST    #6,CODEPREFS+2      ; SEE IF EXPORT ALL
  1285.     BNE.S   .EA
  1286.     CLR.W   EXPORTFLAG
  1287. .EA:MOVE.L  A0,CURECODE
  1288.     MOVEQ   #0,D4
  1289.     MOVE.W  D4,(A1)+
  1290.     CMP.B   #10,-1(A0)
  1291.     BNE.S   .2
  1292.     ADDQ.W  #1,LINENUM      ; COUNT LINES
  1293.     MOVE.W  LINENUM(PC),LINENUM2
  1294. .2: MOVE.L  STARTINTERIM(PC),A0 ; SEE IF WE PARSED AN EMPTY LINE
  1295.     CMP.L   A1,A0
  1296.     BEQ.S   .1
  1297.     MOVE.L  A1,CURINTERIM
  1298.     ADDQ.W  #1,STATS
  1299.     BRA.S   .3
  1300. .1: SUBQ.L  #6,A0
  1301.     MOVE.L  A0,CURINTERIM
  1302. .3: BSR POSTOPTI
  1303.     RTS             ; THE ONLY WAY OUT
  1304.  
  1305. CONTINUEKEY:
  1306.         DC.B    1,0,1,0,1,1,0,1,0,1,1,0 ; PROC .. DEFA
  1307.         DC.B    0,0,1,1,1,1,0,1,0,0,0,1 ; ENDS .. INC
  1308.         DC.B    1,1,0,0,0,1,1,1,1,0,0,0 ; DEC  .. FULL
  1309.         DC.B    0,0,0,1,1,0,0,1,1,1,1,0 ; LARG .. LIST
  1310.         DC.B    1,0,1,0,1,1,1,1,0,0,1,0 ; OBJE .. EXPO
  1311.         DC.B    0,1,1,1,0,0,0,0,1,0,0,0 ; REG  .. LINK
  1312.         DC.B    1,0,1,0,0,0,0,0,0,0,0,0 ; EXTR .. CODE
  1313.         DC.B    0,0,0,0,0,0,0,0,0,0,0,0 ; DATA ..
  1314.         EVEN
  1315.  
  1316.  
  1317. ; ALSO CALLED FROM PREP!!!
  1318.  
  1319. MOVEBUF:
  1320.     MOVE.L  A1,CURINTERIM       ; FOR CHECK.
  1321.     MOVE.L  A1,D7           ;
  1322.     BSR REALLOC1        ; CHECK DOUBLECHECK
  1323.     MOVE.L  CURINTERIM(PC),A1   ;
  1324.     SUB.L   A1,D7           ;
  1325.     BEQ.S   .1          ;
  1326.     NEG.L   D7          ;
  1327.     ADD.L   D7,STARTINTERIM     ;
  1328.     TST.L   CONSTD          ;
  1329.     BEQ.S   .1          ;
  1330.     ADD.L   D7,CONSTD       ;
  1331. .1: RTS
  1332.  
  1333. PCONTINUE:
  1334.     BSR.S   MOVEBUF
  1335.     CMP.B   #10,-1(A0)
  1336.     BNE PARSELOOP
  1337.     ADDQ.W  #1,LINENUM      ; COUNT LINES
  1338.     BRA PARSELOOP
  1339.  
  1340. REBACK:
  1341.     MOVE.W  #1,ERRWHERE
  1342.     MOVE.L  LINENUMZ,LINENUM
  1343.     BRA RESBACK
  1344.  
  1345. STATS:    DC.W    0
  1346.  
  1347. ;; RESOLVECONST
  1348. RESOLVECONST:
  1349.     ADDQ.W  #1,STATS
  1350.     MOVE.W  #2,ERRWHERE     ; A1 NOW
  1351.     MOVE.L  LINENUM(PC),D6
  1352.     MOVE.L  LINENUMZ(PC),LINENUM
  1353.     MOVE.L  D6,LINENUMZ
  1354.     MOVE.L  A1,D6           ; D6=ENDPARSE
  1355.     MOVEQ   #0,D4
  1356.     MOVE.W  D4,(A1)+
  1357.     MOVE.L  D0,A1
  1358.     MOVE.L  D0,A3
  1359.     MOVE.L  A3,INTERMED     ; !!!!
  1360.     MOVE.W  (A3)+,D7        ; INS. CODE
  1361.     CLR.L   CONSTD
  1362.     CMP.W   #IOFF,D7
  1363.     BEQ PROCPARSE
  1364.     CMP.W   #IOFF+32,D7
  1365.     BEQ .OPT
  1366.     CMP.W   #IOFF+33,D7
  1367.     BEQ MODULELOAD
  1368.     CMP.W   #IOFF+76,D7
  1369.     BEQ LIBLOAD
  1370.     CMP.W   #IOFF+53,D7
  1371.     BEQ DOENUM
  1372.     CMP.W   #IOFF+54,D7
  1373.     BEQ DOSET
  1374.     CMP.W   #IOFF+58,D7
  1375.     BEQ DORAISE
  1376.     CMP.W   #IOFF+68,D7
  1377.     BEQ DOLIBRARY
  1378. .1: TST.W   INPROC
  1379.     BNE iERROR35
  1380. ;; CONST
  1381.     GETM    A4          ; CONST
  1382.     
  1383.     TST.L   ConstsList
  1384.     BNE.S   .a
  1385.     MOVE.L  A4,ConstsList
  1386. .a: TST.L   ConstTemp
  1387.     BEQ.S   .z
  1388.     MOVe.L  ConstTemp,A6
  1389.     MOVE.L  A4,(A6)
  1390. .z: MOVe.L  A4,ConstTemp
  1391.     CLR.L   (A4)
  1392.     ADDQ.L  #8,A4
  1393.     DONEM   A4
  1394.     MOVE.L  A4,A6
  1395.     GETM    A4
  1396.     MOVE.L  A4,-(A6)
  1397.  
  1398.     CMP.W   #25,(A3)+
  1399.     BNE     iERROR0
  1400.     MOVE.L  (A3)+,4(A4)
  1401.     MOVE.L  (A3)+,A6
  1402.     MOVE.L  (A6),(A4)
  1403.     MOVE.L  A4,(A6)
  1404.     ADDQ.L  #8,A4
  1405.     CMP.W   #11,(A3)+
  1406.     BNE iERROR0
  1407.     MOVE.L  A0,-(A7)
  1408.     BSR ASM_GRABVALUE
  1409.     MOVE.L  (A7)+,A0
  1410.     CMP.W   #-1,D0
  1411.     beq     .STRING
  1412.     MOVE.L  D1,(A4)+
  1413.     CLR.W   (A4)+
  1414.     TST.W   EXPORTFLAG
  1415.     BEQ.S   .NE
  1416.     BSET    #0,-2(A4)
  1417. .NE:DONEM   A4
  1418. .MAINLOOP:
  1419.     CMP.W   #COM,(A3)+
  1420.     BEQ     .1
  1421.     TST.W   -2(A3)
  1422.     BNE iERROR0
  1423.     BRA REBACK
  1424.  
  1425. .STRING:    ; string constants here 8D
  1426.     cmp.w   #STR,(a3)
  1427.     bne     iERROR30
  1428.     move.l  a4,d0
  1429.     addq.l  #6,d0
  1430.     move.l  d0,(a4)+
  1431.     tst.w   EXPORTFLAG
  1432.     sne     D0
  1433.     and.b   #$1,d0
  1434.     or.b    #2,d0
  1435.     move.b  d0,(a4)+
  1436.     clr.b   (a4)+
  1437.     moveq   #0,d7
  1438.     move.l  a4,a6
  1439.     clr.w   (a4)+
  1440. .LP:cmp.w   #STR,(a3)+
  1441.     bne     iERROR30
  1442.     moveq   #0,d0
  1443.     moveq   #0,d1
  1444.     move.w  (a3)+,d0
  1445.     add.w   d0,d7
  1446.     move.w  (a3)+,d1
  1447.     lsl.w   #1,d1
  1448.     sub.l   d0,d1
  1449.     subq.l  #1,d0
  1450. .C: move.b  (a3)+,(a4)+
  1451.     dbf     d0,.C
  1452.     add.l   d1,a3
  1453.     cmp.w   #7,(a3)+
  1454.     beq     .LP
  1455.     subq.l  #2,a3
  1456.     clr.b   (a4)+
  1457.     move.l  a4,d0
  1458.     btst    #0,d0
  1459.     beq     .CE
  1460.     clr.b   (a4)+
  1461. .CE:DONEH   A4
  1462.     move.w  d7,(a6)
  1463.     bra     .MAINLOOP
  1464.  
  1465.  
  1466. ;*-*
  1467. ;; OPTS
  1468. .OPT:   CMP.W   #1,STATS        ; OPT
  1469.     BNE iERROR35
  1470.     CLR.W   STATS
  1471. .2: MOVE.W  (A3)+,D7
  1472.     CMP.W   #VALUE,D7
  1473.     BEQ .CPU
  1474. ;; STACK
  1475.     CMP.W   #IOFF+34,D7     ; --> STACK=X
  1476.     BNE.S   .4B
  1477.     CMP.L   #$B0001,(A3)+
  1478.     BNE iERROR0
  1479.     MOVE.L  (A3)+,D7
  1480.     CMP.L   #MINSTACKSIZE,D7
  1481.     BMI iERROR31
  1482.     BSET    #0,CODEPREFS+3
  1483.     MOVE.L  D7,CODESTACK
  1484.     BRA .5
  1485. ;*-*
  1486. ;; PREPROCESS
  1487. .4B:
  1488.     CMP.W   #IOFF+67,D7     ; --> PREPROCESS
  1489.     BNE.S   .4BB
  1490.     BSET    #7,CODEPREFS+1
  1491.     BRA .5
  1492. ;*-*
  1493. ;; EXPORT
  1494. .4BB:
  1495.     CMP.W   #IOFF+59,D7     ; --> EXPORT
  1496.     BNE.S   .4C
  1497.     BSET    #6,CODEPREFS+2
  1498.     BRA .5
  1499. ;*-*
  1500. ;; RTD
  1501. .4C:
  1502.     CMP.W   #256+117,D7        ; --> RTD
  1503.     BNE.S   .4D
  1504.     CMP.W   #0,(A3)+
  1505.     BNE iERROR0
  1506.     ;BSET   #0,CODEPREFS+1      ; probs with hooks/callbacks etc.
  1507.     BRA .5
  1508. ;*-*
  1509. ;; REG
  1510. .4D:
  1511.     CMP.W   #IOFF+60,D7     ; --> REG=X
  1512.     BNE.S   .6
  1513.     CMP.L   #$B0001,(A3)+
  1514.     BNE iERROR0
  1515.     MOVE.L  (A3)+,D7
  1516.     TST.L   D7
  1517.     BMI iERROR31
  1518.     CMP.L   #MAXREGVARS+1,D7
  1519.     BPL iERROR31
  1520.     MOVE.W  D7,MAXREGALLOC
  1521.     BRA .5
  1522. ;*-*
  1523. ;; ASM
  1524. .6: CMP.W   #IOFF+37,D7     ; --> ASM
  1525.     BNE.S   .7
  1526.     BSET    #3,CODEPREFS+3
  1527.     MOVE.W  #-1,SCOPE       ;     NO NEED OF SCOPES ANYMORE
  1528.     MOVE.W  #-1,MAINF       ;     ... AND NO MAIN EITHER
  1529.     BRA .5
  1530. ;*-*
  1531. ;; NOWARN
  1532. .7: CMP.W   #IOFF+38,D7     ; --> NOWARN
  1533.     BNE.S   .8
  1534.     BSET    #4,CODEPREFS+3
  1535.     BRA .5
  1536. ;*-*
  1537. ;; DIR
  1538. .8: CMP.W   #IOFF+43,D7     ; --> DIR
  1539.     BNE.S   .9
  1540.     CMP.L   #$B0006,(A3)+
  1541.     BNE iERROR0
  1542.     ADDQ.L  #2,A3
  1543.     MOVE.W  (A3)+,D0
  1544.     MOVE.L  DIRNAMEX(PC),A4
  1545.     SUBQ.W  #1,D0
  1546. .XL:MOVE.W  (A3)+,(A4)+
  1547.     DBRA    D0,.XL
  1548.     BRA     .5
  1549. ;*-*
  1550. ;; OSVERSION
  1551. .9: CMP.W   #IOFF+52,D7     ; --> OSVERSION
  1552.     BNE.S   .10
  1553.     BSET    #0,CODEPREFS+2
  1554.     CMP.L   #$B0001,(A3)+
  1555.     BNE iERROR0
  1556.     MOVE.L  (A3)+,D7
  1557.     CMP.L   #33,D7
  1558.     BMI iERROR31
  1559.     CMP.L   #100,D7
  1560.     BPL iERROR31
  1561.     MOVE.W  D7,OSVERSION
  1562.     BRA     .5
  1563. ;*-*
  1564. ;; LARGE
  1565. .10:
  1566.     CMP.W   #IOFF+36,D7     ; --> LARGE
  1567.     BNE.S   .11
  1568.     BSET    #2,CODEPREFS+3
  1569.     BRA     .5
  1570. ;*-*
  1571. ;; MODULE
  1572. .11:
  1573.     CMP.W   #IOFF+33,D7     ; --> MODULE (OPT)
  1574.     BNE .UTIL
  1575.     BSET    #4,CODEPREFS+2
  1576.     BRA     .5
  1577. ;*-*
  1578. ;; UTILLIB
  1579. .UTIL:
  1580.     CMP.W   #IOFF+69,D7
  1581.     BNE     .POOL
  1582.     CMP.W   #37,OSVERSION
  1583.     BLT     iERROR78
  1584.     BSET    #7,CODEPREFS
  1585.     JSR     SETUPUTIL
  1586.     BRA     .5
  1587. ;*-*
  1588. ;; POOL
  1589. .POOL:
  1590.     CMP.W   #IOFF+70,D7
  1591.     BNE     .LINK
  1592.     CMP.W   #39,OSVERSION
  1593.     BLT     iERROR78
  1594.     BSET    #6,CODEPREFS
  1595.     CMP.W   #17,(A3)
  1596.     BNE     .5
  1597.     ADDQ.L  #2,A3
  1598.     CMP.W   #VALUE,(A3)+
  1599.     BNE     iERROR73
  1600.     MOVE.L  (A3)+,OPENPOOL+2
  1601.     CMP.W   #COM,(A3)
  1602.     BNE     .PX
  1603.     ADDQ.L  #2,A3
  1604.     CMp.W   #VALUE,(A3)+
  1605.     BNE     iERROR73
  1606.     MOVE.L  (A3)+,OPENPOOL+8
  1607.     CMP.W   #COM,(A3)
  1608.     BNE     .PX
  1609.     ADDQ.L  #2,A3
  1610.     CMP.W   #VALUE,(A3)+
  1611.     BNE     iERROR73
  1612.     MOVE.L  (A3)+,OPENPOOL+14
  1613. .PX:CMP.W   #18,(a3)+
  1614.     BNE     iERROR74
  1615.     BRA     .5
  1616. ;*-*
  1617. ;; LINKABLE
  1618. .LINK:
  1619.     CMP.W   #IOFF+72,D7
  1620.     BNE     .NOST
  1621.     TST.L   LIBINFO
  1622.     BNE     iERROR50
  1623.     BSET    #5,CODEPREFS
  1624.     BRA     .5
  1625. ;*-*
  1626. ;; NOSTARTUP
  1627. .NOST:
  1628.     CMP.W   #IOFF+71,D7
  1629.     BNE     .INLINE
  1630.     BSET    #4,CODEPREFS
  1631.     BRA     .5
  1632. ;*-*
  1633. ;; INLINE
  1634. .INLINE:
  1635.     CMP.W   #IOFF+74,D7
  1636.     BNE     .STARTUP
  1637.     BSET    #7,ICODEPREFS+3
  1638.     BRA     .5
  1639. ;*-*
  1640. ;; STARTUP
  1641. .STARTUP:
  1642.     CMP.W   #IOFF+77,D7
  1643.     BNE     .FPEXP
  1644.  
  1645.     BTST    #2,CODEPREFS
  1646.     BNE iERROR50
  1647.     BSET    #2,CODEPREFS
  1648.     MOVEQ   #0,d2
  1649.     CMP.W   #11,(A3)+
  1650.     BNE     iERROR0
  1651.     CMP.W   #STR,(A3)+
  1652.     BNE     iERROR0
  1653.     ADDQ.L  #2,A3
  1654.     move.w  (A3)+,d2
  1655.     SUBQ.W  #1,D2
  1656.     LEA     STCNAME,A4
  1657. .LOOP:
  1658.     MOVE.W  (A3)+,(A4)+
  1659.     DBRA D2,.LOOP
  1660.  
  1661.     BRA .5
  1662. ;*-*
  1663. ;; FPEXP
  1664. .FPEXP
  1665.     cmp.w   #IOFF+81,D7
  1666.     BNE .RUNBG
  1667.     tst.w   EFPU
  1668.     beq iERROR53
  1669.     bset    #1,CODEPREFS
  1670.     bra .5
  1671. ;*-*
  1672. ;; RUNBG
  1673. .RUNBG:
  1674.     cmp.w   #IOFF+89,D7
  1675.     bne .CODE
  1676.  
  1677.     MOVE.L  #BGE-BGS,D6
  1678.  
  1679.     CLR.L   bgName
  1680.     CLR.L   bgPri
  1681.     bset #4,ICODEPREFS+3
  1682.     CMP.W #37,OSVERSION
  1683.     BLT iERROR78
  1684.     CMP.W   #17,(A3)
  1685.     BNE .RUNBG4
  1686.     ADDQ.L  #2,A3
  1687.  
  1688.     ADDQ.L  #8,D6
  1689.  
  1690.     CMP.W   #STR,(A3)+
  1691.     BNE iERROR0
  1692.     ADDQ.W  #2,A3
  1693.     MOVEQ   #0,D2
  1694.     MOVE.W  (A3)+,D2
  1695.     LEA PROCBUF,A4
  1696.     MOVE.L  A4,bgName
  1697.     SUBQ.L  #1,D2
  1698. .RUNBG1:
  1699.     MOVE.W  (A3)+,(A4)+
  1700.     DBRA    D2,.RUNBG1
  1701.     CMp.W   #COM,(A3)
  1702.     BNE     .RUNBG2
  1703.  
  1704.     ADDQ.L  #2,A3
  1705.     CMP.W   #8,(A3)
  1706.     BNE     .RUNBG3
  1707.     ADDQ.L  #2,A3
  1708.     CMP.W   #VALUE,(A3)
  1709.     BNE iERROR30
  1710.     NEG.L   2(A3)
  1711. .RUNBG3:
  1712.     CMP.W   #VALUE,(A3)+
  1713.     BNE iERROR30
  1714.     MOVE.L  (A3)+,D0
  1715.     CMP.L   #128,D0
  1716.     BPl iERROR31
  1717.     CMP.L   #-128,D0
  1718.     BMI iERROR31
  1719.     MOVE.L D0,bgPri
  1720. .RUNBG2:
  1721.     CMP.W   #18,(A3)+
  1722.     BNE iERROR74
  1723. .RUNBG4:
  1724.     TST.L   bgPri
  1725.     BEQ .RUNBG5
  1726.     ADDQ.L  #8,D6
  1727. .RUNBG5:
  1728.     ADD.L   D6,A4STORAGEADR
  1729.     bra .5
  1730. ;*-*
  1731. ;; CODE
  1732. .CODE:
  1733.     CMP.W   #IOFF+84,d7
  1734.     bne     iERROR0
  1735.     cmp.w   #IOFF+87,(a3)
  1736.     bne     .CODE2
  1737.     addq.l  #2,a3
  1738.     bset    #1,ICODEPREFS+3
  1739.     bra     .5
  1740. .CODE2:
  1741.     cmp.w   #IOFF+92,(a3)
  1742.     bne     iERROR0
  1743.     ADDQ.L  #2,A3
  1744.     bset    #0,ICODEPREFS+3
  1745.     bra     .5
  1746. ;*-*
  1747. .5: CMP.W   #COM,(A3)+
  1748.     BEQ .2
  1749.     TST.W   -2(A3)
  1750.     BNE iERROR0
  1751.     JSR     PATCHER
  1752.     BRA REBACK
  1753. ;; CPU
  1754. .CPU:
  1755.     MOVE.L  (A3)+,D7        ; --> OPT 040
  1756.     LEA CPUTAB(PC),A6
  1757.     CMP.L   #603,D7
  1758.     BPL     .PPC
  1759. .CPUL:
  1760.     CMP.W   #-1,(A6)
  1761.     BEQ iERROR31
  1762.     ADD.L   #10,A6
  1763.     CMP.W   (A6),D7
  1764.     BNE.S   .CPUL
  1765.     MOVE.W  (A6)+,D0
  1766.     cmp.w   #060,d0
  1767.     bgt .CPU2
  1768.     move.w  D0,TCPU
  1769. .CPU2:
  1770.     MOVE.W  (A6)+,D0
  1771.     BEQ.S   .C1
  1772.     TST.W   ECPU
  1773.     BNE iERROR50
  1774.     MOVE.W  D0,ECPU
  1775. .C1:MOVE.W  (A6)+,D0
  1776.     BEQ.S   .C2
  1777.     TST.W   EFPU
  1778.     BNE iERROR50
  1779.     MOVE.W  D0,EFPU
  1780. .C2:MOVE.W  (A6)+,D0
  1781.     MOVE.W  ASMCPU(PC),D1
  1782.     BSET    D0,D1
  1783.     MOVE.W  D1,ASMCPU
  1784.     MOVE.W  (A6)+,D0
  1785.     MOVE.W  D0,EMMU
  1786.     BRA     .5
  1787. .PPC:
  1788.     CMP.L   #605,D7
  1789.     BPL     .CPUL
  1790.     MOVE.W  #-1,GENERATE_PPC
  1791.     BSET    #0,CODEPREFS
  1792.     MOVE.W  D7,PCPU
  1793.     BRA     .5
  1794. ;*-*
  1795. ;*-*
  1796. ;; MODULE
  1797. MODULELOAD:
  1798.     TST.W   SCOPE           ; global scope only!
  1799.     BNE iERROR35             ;
  1800.     MOVEM.L A0/A1,-(A7)     ; MODULE    ; D4 GETRASHED!
  1801. MODULELOOP:
  1802.     CLR.L   THISMOD         ;
  1803.     MOVE.L  DOSBASE,A6      ;
  1804.     CMP.W   #STR,(A3)+      ;
  1805.     BNE iERROR0              ;
  1806.     ADDQ.L  #2,A3           ;
  1807.     MOVE.W  (A3)+,D0        ; string length (in words)
  1808.     MOVE.L  A3,A0           ; A0=MOD name
  1809.     MOVE.L  A0,A1           ;
  1810.     LOWER   A1,D1           ;
  1811. BLAAAAAARGH:
  1812.     EXT.L   D0              ;
  1813.     LSL.L   #1,D0           ; string length
  1814.     ADD.L   D0,A3           ;
  1815.     CMP.B   #"*",(A0)       ; check if in cdir
  1816.     BNE.S   .STD            ;
  1817.     ADDQ.L  #1,A0           ;
  1818.     MOVE.L  #PRINTBUF,D1    ;
  1819.     CLR.B   PRINTBUF        ;
  1820.     BRA.S   .CUR            ;
  1821. .STD:
  1822.     MOVE.L  DIRNAMEX(PC),D1 ; directory name
  1823. .CUR:
  1824.     MOVE.L  D1,D6           ; BOTH MODPATH
  1825.     MOVE.L  D1,A1           ;
  1826.     LOWER   A1,D7           ;
  1827.     MOVE.L  A1,D7           ; D7=NAMEOFFSET
  1828.     MOVE.B  -1(A1),D0       ;
  1829.     CMP.L   A1,D1           ;
  1830.     BEQ.S   .2              ;
  1831.     CMP.B   #':',D0         ;
  1832.     BEQ.S   .2              ;
  1833.     CMP.B   #'/',D0         ;
  1834.     BEQ.S   .2              ;
  1835.     MOVE.B  #'/',(A1)+      ; the path :)
  1836. .2: MOVE.B  (A0)+,(A1)+     ; copy
  1837.     BNE.S   .2              ;
  1838.     MOVE.B  #'.',-1(A1)
  1839.     MOVE.B  #'m',(A1)+
  1840.     MOVE.B  #0,(A1)+
  1841.     MOVE.L  D1,CACHENAMESTART
  1842.     MOVE.L  A1,CACHENAMEEND
  1843.     BSR SEARCHINMODLIST     ; CHECK CIRC. INCLUSIONS ETC.
  1844.     TST.L   D0
  1845.     BEQ.S   .1
  1846.     MOVE.L  D0,A0
  1847.     BTST    #0,MI_FLAGS(A0)
  1848.     BEQ .NEXT
  1849.     BCLR    #0,MI_FLAGS(A0)
  1850.     MOVE.L  A0,THISMOD
  1851. .1: BSR SEARCHINCACHE       ; SEE IF MODULE IS ALREADY THERE
  1852.     MOVE.L  D0,A0
  1853.     TST.L   D0
  1854.     BNE.S   .GOTM
  1855.  
  1856.     MOVE.L  D6,D0
  1857.     BSR FILELENGTH
  1858.     MOVE.L  D0,D3
  1859.     BEQ iERROR36
  1860.     BMI iERROR36
  1861.     MOVE.L  #1005,D2
  1862.     JSR -30(A6)         ; OPEN
  1863.     MOVE.L  D0,D5           ; D5=HANDLE
  1864.     BEQ iERROR36
  1865.     MOVE.L  D3,D0
  1866.     ADDQ.L  #8,D0
  1867.     BSR NEWCACHE
  1868.     MOVE.L  D0,D2
  1869.     BEQ iERROR38
  1870.     MOVE.L  D5,D1
  1871.     JSR -42(A6)         ; READ
  1872.     MOVE.L  D0,D4
  1873.     MOVE.L  D5,D1
  1874.     JSR -36(A6)         ; CLOSE
  1875.     CMP.L   D3,D4
  1876.     BNE iERROR36
  1877.     MOVE.L  D2,A0
  1878.     ADD.L   D3,D2
  1879.     MOVE.L  D2,A1
  1880.     CLR.B   (A1)+
  1881.     CLR.B   (A1)+
  1882.     CLR.B   (A1)+
  1883.     CLR.B   (A1)+
  1884.     CLR.B   (A1)+
  1885.     CLR.B   (A1)+           ; max 8!
  1886. .GOTM:  MOVEM.L D0-D7/A0-A6,-(A7)
  1887.     TST.L   THISMOD
  1888.     BEQ.S   .3
  1889.     MOVE.L  THISMOD,A1
  1890.     MOVE.L  A0,MI_MOD(A1)
  1891.     BRA.S   .GM
  1892. .3: GETM    A1              ; CREATE A MODINFO
  1893.     MOVE.L  A1,THISMOD
  1894.     MOVE.L  MODINFOLIST(PC),(A1)        ; MI_NEXT
  1895.     MOVE.L  A1,MODINFOLIST
  1896.     ADDQ.L  #4,A1
  1897.     CLR.W   (A1)+               ; MI_FLAGS
  1898.     MOVE.L  CACHENAMEEND(PC),A2
  1899.     SUB.L   CACHENAMESTART(PC),A2
  1900.     MOVE.L  A2,(A1)+            ; MI_NAMELEN
  1901.     MOVE.L  A0,(A1)+            ; MI_MOD
  1902.     CLR.L   (A1)+               ; MI_LIST
  1903.     LEA 4(A1),A2
  1904.     MOVE.L  A2,(A1)+            ; MI_NAMEPTR
  1905.     MOVE.L  CACHENAMESTART(PC),A2       ; MI_NAME
  1906. .XL:MOVE.B  (A2)+,(A1)+
  1907.     BNE.S   .XL
  1908.     MOVE.L  A1,D0
  1909.     BTST    #0,D0
  1910.     BEQ.S   .E
  1911.     CLR.B   (A1)+
  1912. .E: DONEH   A1
  1913. .GM:    CMP.L   #"EMOD",(A0)+
  1914.     BNE iERROR36
  1915.     JSR MODULEJOBENTRY
  1916.     MOVEM.L (A7)+,D0-D7/A0-A6
  1917. .NEXT:  MOVE.L  D7,A0
  1918.     MOVE.B  #0,(A0)+
  1919.     CMP.W   #COM,(A3)+
  1920.     BEQ MODULELOOP
  1921.     TST.W   -2(A3)
  1922.     BNE iERROR0
  1923.     MOVEM.L (A7)+,A0/A1
  1924.     BRA REBACK
  1925.  
  1926. MODINFOLIST:  DC.L    0
  1927.  
  1928. ; GETS NAME FROM CACHENAMESTART, RETURNS MODINFO OR NIL IN D0
  1929.  
  1930. SEARCHINMODLIST:
  1931.     MOVEM.L D1-D2/A0-A2,-(A7)
  1932.     LEA MODINFOLIST(PC),A0  ; A0=MODLIST
  1933.     MOVE.L  CACHENAMESTART(PC),D1   ; D1=NAME
  1934.     MOVE.L  CACHENAMEEND(PC),D2
  1935.     SUB.L   D1,D2           ; D2=LEN
  1936. .XL:MOVE.L  (A0),D0
  1937.     BEQ.S   .X
  1938.     MOVE.L  D0,A0
  1939.     CMP.L   MI_NAMELEN(A0),D2
  1940.     BNE.S   .XL
  1941.     MOVE.L  MI_NAMEPTR(A0),A1
  1942.     MOVE.L  D1,A2
  1943. .CMP:   CMPM.B  (A1)+,(A2)+
  1944.     BNE.S   .XL
  1945.     TST.B   -1(A1)
  1946.     BNE.S   .CMP
  1947.     MOVE.L  A0,D0
  1948. .X: MOVEM.L (A7)+,D1-D2/A0-A2
  1949.     RTS
  1950.  
  1951. AGAIN:    DC.W    0
  1952.  
  1953. SECONDARYLOAD:
  1954. .ML:    CLR.W   AGAIN
  1955.     MOVE.L  DOSBASE,A6      ; A6=BASE
  1956.     LEA MODINFOLIST(PC),A5  ; A5=LIST
  1957. .XL: MOVE.L  (A5),D0
  1958.     BEQ.W   .X
  1959.     MOVE.L  D0,A5
  1960.     BTST    #0,MI_FLAGS(A5)
  1961.     BEQ.S   .XL
  1962.     BCLR    #0,MI_FLAGS(A5)
  1963.  
  1964.     MOVE.L  MI_NAMEPTR(A5),D0
  1965.     MOVE.L  D0,ERROROBJ
  1966.     MOVE.L  D0,CACHENAMESTART
  1967.     ADD.L   MI_NAMELEN(A5),D0
  1968.     MOVE.L  D0,CACHENAMEEND
  1969.     BSR SEARCHINCACHE
  1970.     MOVE.L  D0,A0
  1971.     TST.L   D0
  1972.     BNE.S   .GOTM
  1973.  
  1974.     MOVE.L  MI_NAMEPTR(A5),D0
  1975.     BSR FILELENGTH
  1976.     MOVE.L  D0,D3
  1977.     BEQ iERROR36
  1978.     BMI iERROR36
  1979.  
  1980.     MOVE.L  MI_NAMEPTR(A5),D1
  1981.     MOVE.L  #1005,D2
  1982.     JSR -30(A6)         ; OPEN
  1983.     MOVE.L  D0,D5           ; D5=HANDLE
  1984.     BEQ iERROR36
  1985.  
  1986.     MOVE.L  D3,D0
  1987.     ADDQ.L  #4,D0
  1988.     BSR NEWCACHE
  1989.     MOVE.L  D0,D2
  1990.     BEQ iERROR38
  1991.     MOVE.L  D5,D1
  1992.     JSR -42(A6)         ; READ
  1993.     MOVE.L  D0,D4
  1994.     MOVE.L  D5,D1
  1995.     JSR -36(A6)         ; CLOSE
  1996.     CMP.L   D3,D4
  1997.     BNE iERROR36
  1998.     MOVE.L  D2,A0
  1999.     ADD.L   D3,D2
  2000.     MOVE.L  D2,A1
  2001.     CLR.B   (A1)+
  2002.     CLR.B   (A1)+
  2003.     CLR.B   (A1)+
  2004.     CLR.B   (A1)+
  2005.  
  2006. .GOTM:  MOVE.L  A5,THISMOD
  2007.     MOVE.L  A0,MI_MOD(A5)
  2008.     CMP.L   #"EMOD",(A0)+
  2009.     BNE iERROR36
  2010.     MOVEM.L D0-D7/A0-A6,-(A7)
  2011.     JSR MINIMUMMODULE
  2012.     MOVEM.L (A7)+,D0-D7/A0-A6
  2013.  
  2014.     BRA.W   .XL
  2015. .X: TST.W   AGAIN
  2016.     BNE.W   .ML
  2017.     CLR.L   ERROROBJ
  2018.     RTS
  2019. ;*-*
  2020. ;; LIB/OBJECTS
  2021. LIBLOAD:
  2022.     TST.W   SCOPE
  2023.     BNE     iERROR30
  2024.     MOVEM.L A0/A1,-(A7)
  2025.     MOVE.L  DOSBASE,A6
  2026. .LIBLOOP1:
  2027.     CMP.W   #STR,(A3)+
  2028.     BNE     iERROR0
  2029.     ADDQ.L  #2,A3
  2030.     MOVEQ   #0,D0
  2031.     MOVE.W  (A3)+,D0
  2032.  
  2033.     move.l  a3,a0
  2034.     lsl.l   #1,d0
  2035.     add.l   d0,a3
  2036.     MOVE.L  #PRINTBUF,A1
  2037.     CLR.B   PRINTBUF
  2038.  
  2039.     MOVE.L  .ELIBPATH,(A1)+
  2040.     MOVE.B  #":",(A1)+
  2041. .LP:MOVE.B  (A0)+,(A1)+
  2042.     BNE     .LP
  2043.  
  2044.     MOVE.B  #".",-1(A1)
  2045.     MOVE.B  #"m",(A1)
  2046.     MOVE.B  #0,1(A1)
  2047.  
  2048.     MOVE.L  A1,.T
  2049.     MOVE.L  A3,-(A7)
  2050.  
  2051.     MOVE.L  #PRINTBUF,D1
  2052.     MOVE.L  D1,D0
  2053.     BSR FILELENGTH
  2054.     TST.L   D0
  2055.     BEQ     iERROR28
  2056.     BMI     iERROR28
  2057.     move.l  d0,-(a7)
  2058.     BSR NEW                 ; get mem
  2059.     move.l  d0,-(a7)
  2060.     move.l  #PRINTBUF,D1
  2061.     MOVE.L  #1005,D2
  2062.     JSR     -30(A6)
  2063.     MOVe.L  D0,D4
  2064.     move.l  (a7),D2
  2065.     move.l  4(a7),d3
  2066.     move.l  d4,d1
  2067.     jsr     -42(a6)
  2068.     move.l  d4,d1
  2069.     jsr     -36(a6)
  2070.  
  2071.     MOVE.L  .T,A1           ; now open lib
  2072.     MOVE.B  #"l",(A1)
  2073.     MOVE.B  #"i",1(A1)
  2074.     MOVE.B  #"b",2(A1)
  2075.     MOVE.B  #0,3(A1)
  2076.  
  2077.     MOVE.L  #PRINTBUF,D1
  2078.     MOVE.L  D1,D0
  2079.     BSR FILELENGTH
  2080.     TST.L   D0
  2081.     BEQ     iERROR28
  2082.     BMI     iERROR28
  2083.     move.l  d0,-(a7)
  2084.     BSR NEW                 ; get mem
  2085.     move.l  d0,-(a7)
  2086.     move.l  #PRINTBUF,D1
  2087.     MOVE.L  #1005,D2
  2088.     JSR     -30(A6)
  2089.     MOVe.L  D0,D4
  2090.     move.l  (a7),D2
  2091.     move.l  4(a7),d3
  2092.     move.l  d4,d1
  2093.     jsr     -42(a6)
  2094.     move.l  d4,d1
  2095.     jsr     -36(a6)
  2096.  
  2097.  
  2098.     move.l  (a7)+,d2        ; lib mem
  2099.     move.l  (a7)+,d3        ; lib size
  2100.     move.l  (a7)+,d0        ; mod mem
  2101.     move.l  (a7)+,d1        ; mod size
  2102.     JSR PARSEOBJECTFILE
  2103.     MOVE.L  (A7)+,A3
  2104.     cmp.w   #COM,(A3)+
  2105.     BEQ .LIBLOOP1
  2106.     TST.W   -(A3)
  2107.     BNE     iERROR0
  2108.     MOVEM.L (A7)+,A0/A1
  2109.     BRA REBACK
  2110.  
  2111. .ELIBPATH:
  2112.     DC.B    'ELIB'
  2113. .T: DC.L    0
  2114. ;*-*
  2115. ;; PROC
  2116. PROCPARSE:            ; PARSE 'PROC bla(a,b,c=1) OF o IS x\0'
  2117.     CLR.W   .REGCNT
  2118.     GETM    A6          ; DEFARGSLIST
  2119.     CLR.W   (A6)+
  2120.     MOVE.L  A6,.A6ST
  2121.     CLR.W   .CNT
  2122.     CMP.W   #IDENT,(A3)+
  2123.     BNE iERROR4
  2124.     MOVE.L  (A3)+,A2        ; A2=PROCNAMEVAR
  2125.     CMP.B   #LAB,4(A2)
  2126.     BNE iERROR4
  2127.     MOVE.W  #-2,10(A2)
  2128.     MOVE.L  6(A2),A4
  2129.     MOVE.L  A2,14(A4)       ; SET PROC.IDENT
  2130.     MOVE.L  A4,A2           ; A2=PTR PROC STRUCT
  2131.     ;BSET   #3,2(A2)
  2132.     ;BNE    iERROR14
  2133.     CMP.W   #17,(A3)+
  2134.     BNE iERROR23
  2135.     MOVEQ   #0,D1           ; D1=NARG
  2136.     MOVE.L  A3,A4           ; BACKUP
  2137. .1: MOVE.W  (A3)+,D0
  2138.     CMP.W   #IDENT,D0
  2139.     BNE .2
  2140.     ADDQ.L  #1,D1
  2141.     ADDQ.L  #4,A3
  2142.  
  2143.     CMP.W   #11,(A3)        ; CHECK FOR a=1 DEFARGS
  2144.     BNE.S   .NIS
  2145.     ADDQ.L  #2,A3
  2146.     cmp.b   #4,(a3)
  2147.     blt     .IS0
  2148.     cmp.b   #5,(a3)
  2149.     bgt     .IS0
  2150.     move.w  (a3)+,(a6)+
  2151.     bset    #5,2(A2)
  2152.     addq.w  #1,.REGCNT
  2153.     addq.w  #1,.CNT
  2154.     bra     .NIS
  2155. .REGCNT:    dc.w    0
  2156. .IS0:
  2157.     CMP.W   #8,(A3)
  2158.     BNE.S   .IS1
  2159.     ADDQ.L  #2,A3
  2160.     NEG.L   2(A3)
  2161. .IS1:
  2162.     CMP.W   #1,(A3)+
  2163.     BNE iERROR30
  2164.     ADDQ.W  #1,.CNT
  2165.     MOVE.L  (A3)+,(A6)+
  2166.  
  2167. .NIS:   BSR .SKIP
  2168.     MOVE.W  (A3)+,D0
  2169.     CMP.W   #COM,D0
  2170.     BEQ.S   .1
  2171. .2: CMP.W   #18,D0
  2172.     BNE iERROR6
  2173.     tst.w   .REGCNT
  2174.     beq     .2_2
  2175.     cmp.w   .REGCNT,D1
  2176.     bne     iERROR50
  2177. .2_2:
  2178.     CLR.W   (A6)+
  2179.     MOVE.L  A6,.A6MID
  2180.     MOVE.L  D6,A1
  2181.     MOVE.W  D1,(A2)
  2182.     BEQ.S   .4
  2183.     MOVE.L  A4,A3
  2184.     MOVEQ   #0,D2
  2185.     LSL.L   #2,D1
  2186.     ADDQ.L  #8,D1
  2187. .3: MOVE.W  (A3)+,D0
  2188.     CMP.W   #IDENT,D0
  2189.     BNE .4
  2190.     MOVE.L  (A3)+,A4        ; A4=VAR
  2191.     ADDQ.L  #4,D2
  2192.     MOVE.L  D1,D3
  2193.     SUB.L   D2,D3
  2194.     MOVE.W  D3,10(A4)
  2195.  
  2196.     TSTMOD
  2197.     BEQ.S   .NAN
  2198.     MOVE.L  (A4),(A6)+
  2199. .NAN:
  2200.     CMP.W   #11,(A3)
  2201.     BNE.S   .NIS2
  2202.     ADDQ.L  #2,A3
  2203.     CMP.B   #4,(A3)
  2204.     BLT     .IS00
  2205.     CMP.B   #5,(A3)
  2206.     BGT     .IS00
  2207.     ADDQ.L  #2,A3
  2208.     BRA     .NIS2
  2209. .IS00:
  2210.     CMP.W   #8,(A3)
  2211.     BNE.S   .IS11
  2212.     ADDQ.L  #2,A3
  2213. .IS11:  ADDQ.L  #6,A3
  2214.  
  2215. .NIS2:  BSR.W   .SKIP
  2216.     MOVE.W  (A3)+,D0
  2217.     CMP.W   #COM,D0
  2218.     BEQ.S   .3
  2219. .4: ADDQ.L  #2,.A6ST        ; EXIT, A3 JUST AFTER ")"
  2220.     CMPA.L  .A6ST(PC),A6
  2221.     BEQ.S   .EX         ; CHECK IF DEFARGS
  2222.     MOVE.L  A3,-(A7)
  2223.     MOVE.L  .A6ST(PC),A3
  2224.     MOVE.W  .CNT(PC),-4(A3)
  2225.     MOVE.L  .A6MID(PC),A3
  2226.     MOVE.L  A6,D0
  2227.     SUB.L   A3,D0
  2228.     LSR.L   #2,D0
  2229.     MOVE.W  D0,-2(A3)
  2230.     MOVE.L  (A7)+,A3
  2231. .22:    MOVE.L  .A6ST,D0
  2232.     SUBQ.L  #4,D0
  2233.     MOVE.L  D0,6(A2)        ; DEFARGSLIST IN PROCSTRUCT
  2234.     DONEH   A6
  2235.  
  2236. .EX:cmp.w   #IOFF+93,(a3)
  2237.     bne     .EX2
  2238.     addq.l  #2,a3
  2239.     bset    #4,2(a2)
  2240. .EX2: CMP.W   #IOFF+45,(A3)+      ; NOW CHECK FOR of_object
  2241.     BNE .NOM
  2242.     TST.W   .REGCNT
  2243.     BNE     iERROR50
  2244.     CMP.W   #31,(A3)+
  2245.     BNE .REX
  2246.     MOVE.L  (A3)+,A3        ; A3=OBJECTHEAD, A2=PROC
  2247.     BTST    #1,2(A3)
  2248.     BNE iERROR69
  2249.     MOVE.L  A3,10(A2)       ; SET PROC TO METHOD
  2250.     MOVE.L  -4(A2),PROCLIST     ; DISCONNECT FROM PROCLIST
  2251.     CLR.L   -4(A2)
  2252.  
  2253.     MOVE.L  14(A2),A6
  2254.     MOVE.L  (A6),D0
  2255.     MOVE.L  A3,A6
  2256.     MOVE.L  A0,-(A7)
  2257.     JSR FINDMETHOD      ; WANTS OBJ=A6,NAME=D0, TRASHES A0,
  2258.     MOVE.L  (A7)+,A0
  2259.     TST.L   D1          ;   RETURNS D1=METHOD | NIL
  2260.     BNE iERROR61
  2261.  
  2262.     GETM    A6
  2263.     MOVE.L  OMETHOD(A3),D2      ; BUILD NEW METHOD:
  2264.     MOVE.L  A6,OMETHOD(A3)
  2265.     MOVE.L  A6,22(A2)
  2266.     MOVE.L  D2,(A6)+        ; SET M_NEXT
  2267.     MOVE.L  A2,(A6)+        ; SET M_PROC
  2268.     MOVE.B  #MT_METHOD,(A6)+    ; SET M_TYPE
  2269.     CLR.B   (A6)+
  2270.     MOVEQ   #4,D0
  2271.     TST.L   D2
  2272.     BEQ.S   .F
  2273.     MOVE.L  D2,A4
  2274.     MOVE.W  M_OFF(A4),D0
  2275.     ADDQ.W  #4,D0
  2276. .F: MOVE.W  D0,(A6)+        ; SET M_OFF TO LAST M_OFF+4
  2277.     ADDQ.W  #4,D0
  2278.     MOVE.W  D0,ODEL(A3)
  2279.     MOVE.L  14(A2),A4       ; A4=IDENT
  2280.     MOVE.L  (A4),(A6)+      ; SET M_NAME
  2281.     BSET    #4,5(A4)        ; SET FLAGS OR METHOD
  2282.     BSET    #0,5(A4)
  2283.     DONEM   A6
  2284.     BSET    #1,2(A2)
  2285.     MOVE.L  CURSELF(PC),D0      ; NOW MAKE A "self" FOR THIS METHOD
  2286.     BNE.S   .GOTS
  2287.     GETM    A6
  2288.     MOVE.L  SELFHASHADR(PC),A4
  2289.     MOVE.L  (A4),(A6)+
  2290.     MOVE.L  A6,(A4)
  2291.     MOVE.L  A6,D0
  2292.     MOVE.L  #SELFNAME,(A6)+     ; IDENT.ASCII
  2293.     MOVE.W  #$0101,(A6)+        ; IDENT.TYPE/FLAGS
  2294.     MOVE.L  A2,(A6)+        ; IDENT.PROC
  2295.     CLR.W   (A6)+           ; IDENT.INFO
  2296.  
  2297.     TST.W   REGSTOP
  2298.     BNE.S   .CLH
  2299.     MOVE.L  #MIDHEAVY*3,(A6)+   ; VARHEAVY: USED 3x (FAKE)
  2300. .CLHB:
  2301.     DONEM   A6
  2302.     MOVE.L  D0,A6
  2303.     BRA.S   .GOTS2
  2304.  
  2305. .CLH:   CLR.L   (A6)+           ; SELF NOT IN REG
  2306.     BRA.S   .CLHB
  2307.  
  2308.  
  2309. .GOTS:  MOVE.L  D0,A6
  2310.     TST.B   4(A6)
  2311.     BNE iERROR50
  2312.     MOVE.B  #1,4(A6)
  2313.     BSET    #0,5(A6)
  2314. .GOTS2: MOVE.L  A6,18(A2)       ; HERE WE HAVE A VALID SELF IN A6
  2315.     BRA.S   .REX
  2316. .NOM:   BTST    #1,2(A2)
  2317.     BNE iERROR21
  2318. .REX:   CLR.L   CURSELF
  2319.     BRA REBACK
  2320. .SKIP:  MOVE.W  (A3)+,D0
  2321.     CMP.W   #19,D0
  2322.     BEQ.S   .SKIP
  2323.     CMP.W   #IOFF+20,D0
  2324.     BEQ.S   .S3
  2325.     CMP.W   #IOFF+44,D0
  2326.     BEQ.S   .S1
  2327.     CMP.W   #IOFF+61,D0
  2328.     BEQ.S   .S3
  2329.     SUBQ.L  #2,A3
  2330. .S3:    RTS
  2331. .S1:    CMP.W   #IOFF+39,(A3)+      ; PTR TO
  2332.     BNE iERROR33
  2333.     CMP.W   #IOFF+20,(A3)
  2334.     BPL.S   .S2
  2335.     CMP.W   #31,(A3)+
  2336.     BNE iERROR33
  2337.     ADDQ.L  #4,A3
  2338.     RTS
  2339. .S2:    CMP.W   #IOFF+23,(A3)+
  2340.     BPL iERROR33
  2341.     RTS
  2342. .CNT:   DC.W    0
  2343. .A6ST:  DC.L    0
  2344. .A6MID: DC.L    0
  2345. ;*-*
  2346. ;; ENUM
  2347. DOENUM:
  2348.     TST.W   INPROC
  2349.     BNE iERROR35
  2350.     MOVEQ   #0,D7
  2351. .1: GETM    A4          ; ENUM
  2352.  
  2353.  
  2354.  
  2355.     TST.L   ConstsList
  2356.     BNE.S   .a
  2357.     MOVE.L  A4,ConstsList
  2358. .a: MOVe.L  ConstTemp,A6
  2359.     CMPA.L  #0,A6
  2360.     BEQ.S   .z
  2361.     MOVE.L  A4,(A6)
  2362. .z: MOVe.L  A4,ConstTemp
  2363.     CLR.L   (A4)
  2364.     ADDQ.L  #8,A4
  2365.     DONEM   A4
  2366.     MOVE.L  A4,A6
  2367.     GETM    A4
  2368.     MOVE.L  A4,-(A6)
  2369.  
  2370.  
  2371.  
  2372.     CMP.W   #25,(A3)+
  2373.     BNE iERROR0
  2374.     MOVE.L  (A3)+,4(A4)
  2375.     MOVE.L  (A3)+,A6
  2376.     MOVE.L  (A6),(A4)
  2377.     MOVE.L  A4,(A6)
  2378.     ADDQ.L  #8,A4
  2379.     CMP.W   #11,(A3)        ; LOOK FOR BASE REDEF.
  2380.     BNE.S   .2
  2381.     ADDQ.L  #2,A3
  2382.     CMP.W   #8,(A3)
  2383.     BNE.S   .NM
  2384.     ADDQ.L  #2,A3
  2385.     CMP.W   #VALUE,(A3)
  2386.     BNE.S   .NM
  2387.     NEG.L   2(A3)
  2388. .NM:    CMP.W   #VALUE,(A3)+
  2389.     BNE iERROR0
  2390.     MOVE.L  (A3)+,D7
  2391. .2: MOVE.L  D7,(A4)+
  2392.     ADDQ.L  #1,D7
  2393.     CLR.W   (A4)+
  2394.     DONEM   A4
  2395.     TST.W   EXPORTFLAG
  2396.     BEQ.S   .NE
  2397.     BSET    #0,-2(A4)
  2398. .NE:    CMP.W   #COM,(A3)+
  2399.     BEQ     .1
  2400.     TST.W   -2(A3)
  2401.     BNE iERROR0
  2402.     BRA REBACK
  2403. ;*-*
  2404. ;; SET
  2405. DOSET:
  2406.     TST.W   INPROC
  2407.     BNE iERROR35
  2408.     MOVEQ   #1,D7
  2409. .1: GETM    A4
  2410.  
  2411.  
  2412.  
  2413.     TST.L   ConstsList
  2414.     BNE.S   .a
  2415.     MOVE.L  A4,ConstsList
  2416. .a: MOVe.L  ConstTemp,A6
  2417.     CMPA.L  #0,A6
  2418.     BEQ.S   .z
  2419.     MOVE.L  A4,(A6)
  2420. .z: MOVe.L  A4,ConstTemp
  2421.     CLR.L   (A4)
  2422.     ADDQ.L  #8,A4
  2423.     DONEM   A4
  2424.     MOVE.L  A4,A6
  2425.     GETM    A4
  2426.     MOVE.L  A4,-(A6)
  2427.  
  2428.  
  2429.  
  2430.     TST.L   D7          ; SEE IF SET>32
  2431.     BEQ iERROR7
  2432.     CMP.W   #25,(A3)+
  2433.     BNE iERROR0
  2434.     MOVE.L  (A3)+,4(A4)
  2435.     MOVE.L  (A3)+,A6
  2436.     MOVE.L  (A6),(A4)
  2437.     MOVE.L  A4,(A6)
  2438.     ADDQ.L  #8,A4
  2439.     MOVE.L  D7,(A4)+
  2440.     LSL.L   #1,D7
  2441.     CLR.W   (A4)+
  2442.     DONEM   A4
  2443.     TST.W   EXPORTFLAG
  2444.     BEQ.S   .NE
  2445.     BSET    #0,-2(A4)
  2446. .NE:    CMP.W   #COM,(A3)+
  2447.     BEQ     .1
  2448.     TST.W   -2(A3)
  2449.     BNE iERROR0
  2450.     BRA REBACK
  2451. ;*-*
  2452. ;; LIBRARY
  2453. DOLIBRARY:
  2454.     BTST    #5,CODEPREFS
  2455.     BNE iERROR50
  2456.     TST.W   SCOPE
  2457.     BNE iERROR35
  2458.     TSTMOD
  2459.     BNE iERROR50
  2460.     MOVE.L  LIBINFO(PC),D7
  2461.     BNE iERROR50
  2462.     CMP.W   #STR,(A3)+
  2463.     BNE iERROR0
  2464.     ADDQ.L  #2,A3
  2465.     MOVE.W  (A3)+,D7
  2466.     LSL.W   #1,D7
  2467.     GETM    A4
  2468.     DONEH   A4
  2469.     GETM    A4
  2470.     MOVE.L  A4,A6           ; A6=LIBINFO
  2471.     MOVE.L  A4,LIBINFO
  2472.     MOVE.L  A3,(A4)+        ; LIBRARY NAME
  2473.     ADD.W   D7,A3
  2474.     CMP.W   #COM,(A3)+
  2475.     BNE iERROR5
  2476.     CMP.W   #VALUE,(A3)+
  2477.     BNE iERROR30
  2478.     MOVE.L  (A3)+,(A4)+     ; VERSION
  2479.     CMP.W   #COM,(A3)+
  2480.     BNE iERROR5
  2481.     CMP.W   #VALUE,(A3)+
  2482.     BNE iERROR30
  2483.     MOVE.L  (A3)+,(A4)+     ; REVISION
  2484.     CMP.W   #COM,(A3)+
  2485.     BNE iERROR5
  2486.     CMP.W   #STR,(A3)+
  2487.     BNE iERROR0
  2488.     ADDQ.L  #2,A3
  2489.     MOVE.W  (A3)+,D7
  2490.     LSL.W   #1,D7
  2491.     MOVE.L  A3,(A4)+
  2492.     ADD.W   D7,A3
  2493.     CLR.L   (A4)+
  2494.     CMP.W   #IOFF+73,(A3)
  2495.     BNE     .E
  2496.     ADDQ.L  #2,A3
  2497.     CMP.W   #VALUE,(A3)+    ; EXTRA!!!
  2498.     BNE     iERROR75
  2499.     MOVE.L  (A3)+,D7
  2500.     BMI     iERROR31
  2501.     CMP.L   #32000,D7
  2502.     BGT     iERROR31
  2503.     BTST    #0,D7
  2504.     BNE     iERROR75
  2505.  
  2506.     ADD.L   D7,InitTable
  2507.     ADD.W   D7,PatchLib1+2
  2508.     ADD.W   D7,PatchLib2+2
  2509.     ADD.W   D7,PatchLib3+2
  2510.     ADD.W   D7,GETTC+2
  2511.     ADD.W   D7,NEWTC+2
  2512.     ADD.W   D7,GETA4+6
  2513.  
  2514. .E: CMP.W   #IOFF+62,(A3)+
  2515.     BNE iERROR0
  2516. .X: CMP.W   #IDENT,(A3)+
  2517.     BNE iERROR4
  2518.     MOVE.L  (A3)+,(A4)+
  2519.     BSR PARSE_REGLIST
  2520.     CMP.W   #COM,(A3)+
  2521.     BEQ .X
  2522.     TST.W   -2(A3)
  2523.     BNE iERROR5
  2524.     MOVE.L  A4,D7
  2525.     SUB.L   A6,D7
  2526.     SUB.L   #20,D7
  2527.     DIVS.W  #20,D7          ; SIZE OF PROCS!
  2528.     MOVE.W  D7,18(A6)
  2529.     CLR.L   (A4)+
  2530.     MOVE.L  (A6),A5
  2531.     MOVE.L  A4,(A6)
  2532. .1: MOVE.B  (A5)+,(A4)+
  2533.     BNE.S   .1
  2534.     MOVE.L  12(A6),A5
  2535.     MOVE.L  A4,12(A6)
  2536. .2: MOVE.B  (A5)+,(A4)+
  2537.     BNE.S   .2
  2538.     MOVE.L  A4,D0
  2539.     BTST    #0,D0
  2540.     BEQ.S   .3
  2541.     CLR.B   (A4)+
  2542. .3: DONEH   A4
  2543.     BRA REBACK
  2544. ;*-*
  2545. ;; Library reglist parser
  2546. PARSE_REGLIST:            ; A3=INTERIM, A4=BUF
  2547.     CMP.W   #17,(A3)
  2548.     BNE.S   .X
  2549.     MOVEM.L D0/D1/D2,-(A7)
  2550.     MOVEQ   #0,D0           ; MASK
  2551.     MOVEQ   #0,D1           ; NARGS
  2552.     ADDQ.L  #2,A3
  2553.     CMP.W   #18,(A3)
  2554.     BEQ.S   .BR
  2555. .XL:MOVE.B  (A3)+,D2
  2556.     CMP.B   #4,D2
  2557.     BEQ.S   .1
  2558.     CMP.B   #5,D2
  2559.     BNE iERROR19
  2560. .1: MOVE.B  (A3),(A4)+
  2561.     MOVEQ   #15,D2          ; REVERSE MASK
  2562.     SUB.B   (A3)+,D2
  2563.     BSET    D2,D0
  2564.     BNE iERROR50
  2565.     ADDQ.L  #1,D1
  2566.     CMP.W   #18,(A3)
  2567.     BEQ.S   .BR
  2568.     CMP.W   #COM,(A3)+
  2569.     BNE iERROR5
  2570.     BRA.S   .XL
  2571. .BR:    ADDQ.L  #2,A3
  2572.     MOVEQ   #12,D2
  2573.     SUB.W   D1,D2
  2574.     BMI iERROR70
  2575.     ADD.W   D2,A4
  2576.     MOVE.W  D0,(A4)+
  2577.     MOVE.W  D1,(A4)+
  2578.     MOVEM.L (A7)+,D0/D1/D2
  2579.     RTS
  2580. .X: CMP.B   #6,(A3)
  2581.     BEQ.S   .AX
  2582.     ADD.W   #12,A4
  2583.     MOVE.L  #-1,(A4)+
  2584.     RTS
  2585. .AX:    MOVEM.L D0/D1,-(A7)
  2586.     MOVE.W  (A3)+,D0
  2587.     AND.W   #%111,D0
  2588.     ADDQ.W  #8,D0
  2589.     MOVE.B  D0,(A4)+
  2590.     ADD.W   #11,A4
  2591.     MOVEQ   #15,D1
  2592.     SUB.W   D0,D1
  2593.     MOVEQ   #0,D0
  2594.     BSET    D1,D0
  2595.     MOVE.W  D0,(A4)+
  2596.     MOVE.W  #1,(A4)+
  2597.     MOVEM.L (A7)+,D0/D1
  2598.     RTS
  2599.  
  2600. DORAISE:
  2601.     TST.W   SCOPE
  2602.     BNE iERROR35
  2603. .1: CMP.W   #VALUE,(A3)+
  2604.     BNE iERROR30
  2605.     MOVE.L  (A3)+,D7        ; RAISE ID
  2606.     CMP.W   #IOFF+2,(A3)+
  2607.     BNE iERROR0          ; WE NEED AN "IF"
  2608.     CMP.W   #22,(A3)+
  2609.     BNE .LIB            ; EFUNC
  2610.  
  2611.     MOVE.L  (A3)+,D0
  2612.     SUB.L   #EFUNCTAB,D0
  2613.     LSR.L   #4,D0
  2614.     MOVE.L  #EFUNCRAISE,A4
  2615.     MULU.W  #10,D0
  2616.     EXT.L   D0
  2617.     ADD.L   D0,A4
  2618.     BRA.S   .NEXT
  2619.  
  2620. .LIB:   CMP.W   #38,-2(A3)
  2621.     BNE iERROR0
  2622.     MOVE.L  (A3)+,A4        ; LIBRECORD
  2623.     MOVE.W  RAISENUM(PC),D0
  2624.     MOVE.W  D0,8(A4)
  2625.     CMP.W   #MAXLIBRAISE,D0
  2626.     BEQ iERROR37
  2627.     MULU    #10,D0
  2628.     EXT.L   D0
  2629.     MOVE.L  #LIBRAISE,A4
  2630.     ADD.L   D0,A4
  2631.     ADDQ.W  #1,RAISENUM
  2632.  
  2633. .NEXT:  MOVE.L  D7,2(A4)        ; SET EXCEPT ID
  2634.     CMP.L   #$110012,(A3)+      ; ()        A4 --> RECORD
  2635.     BNE iERROR23
  2636.     MOVE.W  (A3)+,D1
  2637.     CMP.W   #11,D1
  2638.     BMI iERROR0
  2639.     CMP.W   #17,D1
  2640.     BPL iERROR0
  2641.     MOVE.W  D1,(A4)
  2642.     CMP.W   #8,(A3)
  2643.     BNE.S   .2
  2644.     ADDQ.L  #2,A3
  2645.     CMP.W   #VALUE,(A3)
  2646.     BNE.S   .2
  2647.     NEG.L   2(A3)
  2648. .2: CMP.W   #VALUE,(A3)+
  2649.     BNE iERROR30
  2650.     MOVE.L  (A3)+,6(A4)
  2651.     CMP.W   #COM,(A3)+
  2652.     BEQ .1
  2653.     TST.W   -2(A3)
  2654.     BNE iERROR0
  2655.     CLR.W   BUSYRAISE       ; !
  2656.     BRA REBACK
  2657. ;*-*
  2658. RAISENUM:   DC.W    0
  2659.  
  2660. OSVERSION:  DC.W    33
  2661. WARNINGS:   DC.L    0
  2662. CODEPREFS:  DC.L    0
  2663. CODESTACK:  DC.L    0
  2664. MAXREGALLOC:DC.W    0
  2665. ConstTemp:  DC.L    0
  2666.  
  2667. ICODEPREFS: DC.L    0
  2668. PCPU:       DC.W    0       ; 603, 604
  2669. GENERATE_PPC:
  2670.             DC.W    0       ; TRUE if generating PPC output.
  2671.  
  2672. TCPU:       DC.W    0       ; 000, 010, 020, 030, 040, 060.
  2673. ECPU:       DC.W    0       ; 0,1,2 = 000+, 020+, 040+
  2674. EFPU:       DC.W    0       ; 0,1,2 = FFP, 881/882, 040
  2675. EMMU:       DC.W    0       ; 0,1,2 = [-], 851, 020+
  2676. ASMCPU:     DC.W    0       ; BITSET
  2677.  
  2678. CPUTAB:
  2679.     DC.W    000,0,0,0,0       ;
  2680.     DC.W    010,0,0,0,0       ; CPU,ECPUTYPE,EFPUTYPE,ASMCPUBIT#,EMMUTYPE
  2681.     DC.W    020,1,0,1,2
  2682.     DC.W    030,1,0,2,2
  2683.     DC.W    040,2,2,3,2
  2684.     DC.W    060,2,3,7,2
  2685.     DC.W    881,0,1,8,0
  2686.     DC.W    882,0,1,9,0
  2687.     DC.W    851,0,0,10,1
  2688.     DC.W    -1
  2689.  
  2690. STARTUP_CODE:
  2691.     DC.L    0
  2692. STARTUP_SIZE:
  2693.     DC.L    0
  2694. STARTUP_XTNS:
  2695.     DC.L    0
  2696. STARTUP_NODE:
  2697.     DC.L    0
  2698. ;*-*
  2699.  
  2700. PARSEGETINSNR:            ; GETS INSNR OUTOF WORKBUF
  2701.     MOVEQ   #0,D0           ; INSNR (MUST BE <>0 AT END)
  2702.     MOVE.W  CURINS(PC),-(A7)
  2703.     MOVEQ   #-1,D1
  2704.     MOVE.W  D1,CURINS
  2705.     MOVE.L  HASHVAL(PC),D7
  2706.     LSL.L   #2,D7
  2707.     ADD.L   #KEYHASH,D7
  2708.     MOVE.L  D7,A6
  2709. .LOOP:  MOVE.L  (A6),A6         ; A6 _NOW_ POINTS TO ENTRY IN INSTABLE
  2710.     MOVE.L  A6,D6
  2711.     BEQ.S   .4
  2712.     MOVE.L  WORK,A4
  2713.     MOVE.L  (A6)+,A5
  2714. .2: CMPM.B  (A4)+,(A5)+
  2715.     BNE.S   .LOOP
  2716.     TST.B   -1(A4)
  2717.     BNE.S   .2
  2718.     SUB.L   #INSTABLE,D6
  2719.     LSR.L   #3,D6
  2720.     MOVE.L  D6,D1
  2721.     MOVE.W  #IOFF,D0
  2722.     ADD.W   D1,D0           ; STAY: 0..20, 50..59, 62..
  2723.     CMP.W   #IOFF+20,D0
  2724.     BPL.S   .4
  2725.     MOVE.W  D1,CURINS
  2726. .3: ADDQ.L  #2,A7
  2727.     RTS
  2728. .4: CMP.W   #IOFF+50,D0
  2729.     BPL.S   .5
  2730. .6: MOVE.W  (A7)+,CURINS
  2731.     RTS
  2732. .5: CMP.W   #IOFF+60,D0
  2733.     BPL.S   .7
  2734.     BRA.S   .3
  2735. .7: CMP.W   #IOFF+62,D0
  2736.     BPL.S   .3
  2737.     BRA.S   .6
  2738.  
  2739. MAKEKEYHASH:
  2740.     MOVE.L  #KEYHASH,A0     ; A0=TABEL
  2741.     LEA INSTABLE,A1
  2742.     MOVE.L  A0,A2
  2743.     MOVE.L  #255,D0
  2744. .CL:    CLR.L   (A2)+           ; CLEAR TABLE
  2745.     DBRA    D0,.CL
  2746. .LOOP:  MOVE.L  (A1),D0
  2747.     BEQ.S   .EX
  2748.     MOVE.L  D0,A2
  2749.     HASH    A2,D0,D1
  2750.     LSL.L   #2,D0
  2751.  
  2752.     LEA 0(A0,D0.L),A2
  2753.     MOVE.L  (A2),D0         ; READ PREVIOUS LIST (OR NIL)
  2754.     MOVE.L  A1,(A2)         ; PUT ENTRY IN LIST
  2755.     MOVE.L  D0,4(A1)        ; AND LINK TAIL TO IT
  2756.     ADDQ.L  #8,A1
  2757.     BRA.S   .LOOP
  2758. .EX:    RTS
  2759.  
  2760. CURINS: DC.W    0
  2761. ;*-*
  2762.  
  2763.